有没有办法在JavaScript中读取二进制数据?

时间:2008-11-29 16:43:32

标签: javascript binary

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

var binObj = new BinaryObject('101010100101011');

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

11 个答案:

答案 0 :(得分:30)

您可以使用parseInt:

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

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

答案 1 :(得分:23)

这个binary ajax libraryexplained here,还有another binary parser library可以处理更多数据类型。

您还可以查看包含a binary Blob object的Google Gears,或者查看为Flash提供javascript包装,其中提供native ByteArray implementation

或者......你可以等待并希望所有这些事情变成standard :)

答案 2 :(得分: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使用浏览器的最新可用读取功能。

答案 3 :(得分:10)

JavaScript对原始二进制数据的支持很少。一般来说,最好是在这个限制范围内生活。但是,我正在考虑尝试一个涉及操作巨大位图来在OLAP数据库中进行集合操作的项目。 这不适用于IE

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

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

如果有人试图这样做,请告诉我它的效果如何。

答案 4 :(得分:2)

那将是另一种方式... 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;
}

答案 5 :(得分:2)

在不久的将来,您将可以使用ArrayBuffersFile API Blobs

答案 6 :(得分:2)

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

答案 7 :(得分:1)

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

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

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

作为旁注,如果您希望在浏览器获取可用数据后进行混淆(在解密/解压缩之后),则很容易规避。

答案 8 :(得分:1)

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

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

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

答案 9 :(得分:1)

jBinary“可以轻松地在浏览器和Node.js中创建,加载,解析,修改和保存复杂的二进制文件和数据结构。”

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

答案 10 :(得分:0)

欢迎所有在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