【问题标题】:Is there a way to read binary data in JavaScript?有没有办法在 JavaScript 中读取二进制数据?
【发布时间】:2010-09-24 13:40:01
【问题描述】:

我想将二进制数据注入 JavaScript 中的对象。有没有办法做到这一点?

var binObj = new BinaryObject('101010100101011');

类似的东西。任何帮助都会很棒。

【问题讨论】:

    标签: javascript binary


    【解决方案1】:

    你可以使用 parseInt:

    var bin = parseInt('10101010', 2);

    第二个参数(基数)是输入的基数。

    【讨论】:

    • 我不得不指出,这个答案在 2012 年已经过时了。你现在有 Typed Arrays khronos.org/registry/typedarray/specs/latest Ex: var arr = Uint8Array(new ArrayBuffer(1000));
    • @lenkite - 这是一个可能的扩展,还是在大多数当前浏览器中都可用(考虑到大多数用户的浏览器已经使用了 2/3 年)?
    • @DannyStaple - 除了(当然)IE: caniuse.com/#feat=typedarrays
    • 嗯 - 即将推出的 IE 版本有机会吗?
    • 需要注意的是,Android
    【解决方案2】:

    binary ajax library,即explained here,还有another binary parser library,可以处理更多的数据类型。

    您还可以查看具有 a binary Blob object 的 Google Gears,或者查看为 Flash 制作一个提供 native ByteArray implementation 的 javascript 包装器。

    或者……你可以坐等,希望所有这些都变成standard :)

    【讨论】:

    【解决方案3】:

    在所有最新的浏览器上,您都可以这样做:

    xhr.overrideMimeType('text/plain; charset=x-user-defined');
    

    然后检索一个字符串。要获得二进制结果,您必须这样做

    data.charCodeAt(pos) & 0xff;
    

    在 Firefox 和 Chrome 的夜间版本中,您可以将值检索为 ArrayBuffer

    xhr.responseType = "arraybuffer";
    

    然后可以在那里访问结果

    xhr.mozResponseArrayBuffer // Firefox
    xhr.response // Chrome
    

    然后您可以在缓冲区上应用TypedArray(例如:Int32Array)或DataView 来读取结果。


    为了让这个过程更容易,我做了一个jQuery Patch来支持二进制类型和一个DataView Wrapper,它使用了浏览器的最新可用阅读功能。

    【讨论】:

    • 你能否澄清一下如何将二进制数据作为字符串获取,我的 firefox 总是在 'xhr.reponstype ="arraybuffer";' 行结束
    • 你确定这行得通吗?我的 unicode 感觉很刺痛。 Unicode 字符有时超过一个字节。
    【解决方案4】:

    JavaScript 对原始二进制数据的支持很少。一般来说,最好在这个限制内生活。但是,我正在考虑为我的一个项目尝试一个技巧,该技巧涉及操纵巨大的位图以在 OLAP 数据库中进行设置操作。 这在 IE 中不起作用

    基本思想是这样的:将二进制数据强制转换为 PNG 以将其发送到 JavaScript,例如,位图可能是黑白 PNG,黑色是 100% 透明的。然后使用 Canvas 操作进行按位数据操作。

    HTML5 Canvas 包含一个pixel array type,它允许访问图像中的字节。 Canvas 还支持合成操作,例如 XOR。 Lighten 和 darken 应该可以做 AND 和 OR。这些操作很可能在任何支持它们的浏览器中得到很好的优化——可能使用 GPU。

    如果有人尝试过,请告诉我它的效果如何。

    【讨论】:

    • 当您使用 HTML5 画布时,请尝试使用 processingJS 库。它们有很多有用的实用功能。
    【解决方案5】:

    反之亦然...powsquareroot 可能由数学类计算...我不知道这是否是最快的方法,但它与 Windows 一样快“程序员视图”中的计算器。

    AlertFormatedBin();
    function AlertFormatedBin()
    {
        var vals = decToBinArr(31,8);
        var i;
    
        var s = "";
        var mod = vals.length % 4;
        for(i= 0; i <mod;i++)
        {
            s+=vals[i];
        }
        if(i>0)
            s+=" ";
        var j = i;
        for(i;i<vals.length;i++)
        {
            s+=vals[i];
            if(i-j != 0 && (i+1-j)%4 == 0)
            {
                s+=" ";
            }
        }
        alert(s);
    }
    
    function decToBinArr(dec, minSize)
    {
        var mod = dec%2;
        var r = new Array();
        if(dec > 1)
        {
            dec-=mod;
            var bd = squareRootRoundedDown(dec);
            if(minSize && minSize-1 > bd)
                bd = minSize-1;
            else
                var i;
                for(i = bd; i>0;i--)
                {
                    var nxt = pow(2,i);
                    if(dec >= nxt)
                    {
                        r[i] = 1;
                        dec-=nxt;
                    }
                    else
                    {
                        r[i] = 0;
                    }
                }
        }
        r[0]= mod;
        r.reverse();
        return r;
    }
    
    function squareRootRoundedDown(dec)
    {
        if(dec<2)
            return 0;
        var x = 2;
        var i;
        for(i= 1;true;i++)
        {
            if(x>=dec)
            {
                i = x == dec ? i : i-1;
                break;
            }
            x= x*2;
        }
        return i;
    }
    
    function pow(b,exp)
    {
        if(exp == 0)
            return 0;
        var i = 1;
        var r= b;
        for(i = 1; i < exp;i++)
            r=r*b;
        return r;
    }
    

    【讨论】:

      【解决方案6】:

      在不久的将来,您将能够使用ArrayBuffersFile API Blobs

      【讨论】:

        【解决方案7】:

        正如@Zippy 在评论中指出的那样,最近(2016 年末)的解决方案包括:

        【讨论】:

          【解决方案8】:

          Javascript 不提供以简单字符串以外的任何形式加载对象的机制。

          您可以做的最接近的是将对象序列化为字符串,可选择加密/压缩它,将其发送到浏览器,并在必要时解密/解压缩,检查完整性,eval() 和pury()。

          您可以使用自己的格式(或者,有大量库的 xml 或 json)并自己解析,而不是使用 eval(这不太安全)。

          附带说明,如果您希望在浏览器获取可用数据后(在解密/解压缩后)进行混淆,那么规避起来太容易了。

          【讨论】:

          • 什么是pray()函数?
          【解决方案9】:

          百分比编码可以将字符串转义为任何二进制 blob 的直接 11 表示形式,并且还可以跨浏览器移植;

          unescape("%uFFFF%uFFFF%uFFFF");
          

          大多数浏览器漏洞利用 this technique 将 shellcode 嵌入 HTML 页面,它非常适合创建任意二进制流。

          【讨论】:

            【解决方案10】:

            jBinary "使在浏览器和 Node.js 中创建、加载、解析、修改和保存复杂的二进制文件和数据结构变得容易。"

            我没用过,但是当我在这里问同样的问题时发现它......

            【讨论】:

              【解决方案11】:

              欢迎所有在 Google 上找到此旧帖子的人。我想出了一个可在 2019 年开始在 Chrome 中运行的解决方案,所以希望这只是一些附加功能或大多数人错过的功能。

              您可以为您的号码使用0b 前缀。它不会完全得到二进制表示,但您可以轻松地将其转换为整数进行存储。例如,您可以这样存储二进制数1010

              var binNum = 0b1010 //Stores as an integer, which would be 10
              

              如果您好奇,它也适用于带有 0x 前缀的十六进制:

              var binNum = 0x1010 //Stores as an integer, which would be 4112
              

              【讨论】:

                猜你喜欢
                • 2017-05-11
                • 2018-01-19
                • 2011-05-21
                • 2011-01-22
                • 1970-01-01
                • 2013-09-25
                • 2019-04-04
                • 2013-04-30
                • 2023-03-10
                相关资源
                最近更新 更多