46

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

IE

var binObj = new BinaryObject('101010100101011');

有这样的效果。任何帮助都会很棒。

4

11 回答 11

31

您可以使用 parseInt:

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

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

于 2008-11-29T16:46:32.690 回答
23

这里解释了这个二进制 ajax 库,还有另一个可以处理更多数据类型的二进制解析器库。

您还可以查看具有二进制 Blob 对象的 Google Gears或查看为 Flash 制作 javascript 包装器,该包装器提供本机 ByteArray 实现

或者......你可以坐等,希望所有这些事情都成为标准:)

于 2009-11-22T21:15:28.023 回答
16

在所有最近的浏览器上,您可以执行以下操作:

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 。

于 2011-01-27T11:02:57.903 回答
11

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

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

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

如果有人尝试这个,请让我知道它的效果如何。

于 2009-09-11T16:57:44.127 回答
2

那将是另一种方式......pow并且squareroot可能由数学类计算......我不知道它是否是最快的方式,但它与“程序员视图”中的 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;
}
于 2010-12-10T16:42:56.323 回答
2

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

于 2011-01-07T23:24:44.507 回答
2

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

于 2016-11-19T15:26:17.740 回答
1

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

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

除了使用 eval (这不太安全),您可以使用自己的格式(或者,有很多库的 xml 或 json )并自己解析它。

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

于 2008-11-29T23:46:35.727 回答
1

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

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

于 2014-12-18T22:33:08.790 回答
1

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

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

大多数浏览器漏洞利用这种技术将 shellcode 嵌入 HTML 页面,它非常适用于创建任意二进制流。

于 2011-05-17T06:58:57.037 回答
1

欢迎所有在 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
于 2019-10-21T01:10:14.400 回答