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

IT技术 javascript binary
2021-01-25 15:53:56

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

IE

var binObj = new BinaryObject('101010100101011');

那种效果的东西。任何帮助都会很棒。

6个回答

您可以使用 parseInt:

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

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

@DannyStaple - 除了(当然)IE 之外,当今许多浏览器都提供了令人鼓舞的数量:caniuse.com/#feat=typedarrays
2021-03-21 15:53:56
嗯 - 是否有可能推出带有该版本的 IE?
2021-03-22 15:53:56
我不得不指出这个答案现在在 2012 年已经过时了。您现在拥有Typed Arrays khronos.org/registry/typedarray/specs/latest Ex:var arr = Uint8Array(new ArrayBuffer(1000));
2021-03-28 15:53:56
@lenkite - 这是一个可能的扩展,还是在大多数当前浏览器中可用(考虑到大多数用户的浏览器都在 2/3 岁之前)?
2021-04-06 15:53:56
需要注意的是,Android <4 也不支持 TypedArrays。这是一个非常重要的平台。
2021-04-07 15:53:56

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

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

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

这些链接不再有效......我会推荐更新的 jBinary 库:github.com/jDataView/jBinary
2021-04-14 15:53:56

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

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,它使用浏览器的最新可用阅读功能。

你确定这有效吗?我的 unicode 感觉是刺痛的。Unicode 字符有时超过一个字节长。
2021-04-08 15:53:56
您能否阐明如何将二进制数据作为字符串获取,我的 Firefox 总是以“xhr.reponstype ="arraybuffer";”行结束
2021-04-12 15:53:56

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

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

所述HTML5画布包括像素阵列型,从中可以访问字节的图像。Canvas 还支持合成操作,例如 XOR。Lighten 和 Darken 应该可以做 AND 和 OR。这些操作可能会在任何支持它们的浏览器中得到很好的优化——可能使用 GPU。

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

当您使用 HTML5 画布时,请尝试使用 processingJS 库。他们有很多有用的实用功能。
2021-03-21 15:53:56

那将是相反的方式......pow并且squareroot可能由 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;
}