English 中文(简体)
有没有办法在JavaScript中读取二进制数据?
原标题:
  • 时间:2008-11-29 16:43:32
  •  标签:

我想在JavaScript对象中注入二进制数据。这是否有可能?

即.

var binObj = new BinaryObject( 101010100101011 );

类似这样的东西。任何帮助都会很好。

问题回答

你可以使用parseInt:

var bin = parseInt( 10101010 , 2);的翻译为:var bin = parseInt(10101010,2);

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

这里有一个二进制 ajax 库,可以在这里找到介绍,还有另外一个可以处理更多数据类型的二进制解析库

您也可以查看 Google Gears,它具有二进制 Blob 对象,或者查看为 Flash 制作 JavaScript 包装器,提供本机 ByteArray 实现。

或者……您可以坐下来等待并希望所有这些东西成为标准 :)

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

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补丁以支持二进制类型和一个DataView包装器,使用浏览器最新的可用的读取功能。

JavaScript对原始二进制数据的支持非常有限。通常最好遵守这个限制。但是,我正在考虑尝试一种技巧,用于在OLAP数据库中操作大型位图以执行设置操作的项目。这在IE中不起作用。

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

HTML5画布包括一个像素数组类型,允许访问图像中的字节。画布还支持诸如XOR之类的合成操作。加亮和变暗应该能够进行AND和OR操作。这些操作在任何支持它们的浏览器中都可能得到很好的优化-可能使用GPU。

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

那就相反了... powsquareroot 可能由 Math-Class 计算... 我不知道这是否是最快的方法,但它和“程序员视图”的 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;
}

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

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

JavaScript没有提供除简单字符串之外的任何形式加载对象的机制。

最接近的方法是将对象序列化为字符串,可选地进行加密/压缩,将其发送到浏览器,必要时进行解密/解压缩,检查是否合理,然后使用eval()函数编译并祈求成功。

不要使用 eval(它不太安全),你可以使用自己的格式(或者选择xml或json,有很多库可以用),然后自行解析。

顺便提一下,如果你想用这个来混淆浏览器获得的可用数据(在解密/解压缩后),那么它太容易被绕过了。

百分号编码可以将字符串解码为任何二进制块的直接1<->1表示,而且在浏览器之间也可移植。

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

大多数浏览器漏洞利用使用这种技术将Shellcode嵌入HTML页面中,这对创建任意二进制流非常有效。

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

我没有用过它,但当我问与此处提问相同的问题时,这就是我找到的...

欢迎找到这篇老帖子的每个人,我找到了在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




相关问题
热门标签