有没有一种方法来读取JavaScript中的二进制数据?
我想在JavaScript中注入二进制数据到一个对象。 有没有办法做到这一点?
即
var binObj = new BinaryObject('101010100101011');
有这样的效果。 任何帮助将是伟大的。
你可以使用parseInt:
var bin = parseInt('10101010', 2);
第二个参数(基数)是input的基础。
有这里解释的这个二进制ajax库 ,还有另一个二进制parsing器库 ,可以处理更多的数据types。
你也可以看看有一个二进制Blob对象的 Google Gears,或者看一下为Flash提供一个JavaScript包装器,它提供了一个本地的ByteArray实现 。
或者…你可以坐下来等待,并希望所有这些东西成为标准 🙂
在所有最近的浏览器上,你可以做:
xhr.overrideMimeType('text/plain; charset=x-user-defined');
并检索一个string。 要得到二进制结果,你将不得不这样做
data.charCodeAt(pos) & 0xff;
在Firefox和Chrome的每晚构build中,您可以将该值作为ArrayBuffer检索
xhr.responseType = "arraybuffer";
结果可以在那里访问
xhr.mozResponseArrayBuffer // Firefox xhr.response // Chrome
然后,您可以在缓冲区上应用TypedArray (例如:Int32Array)或DataView来读取结果。
为了使这个过程更容易,我做了一个jQuery Patch来支持二进制types和一个使用浏览器的最新可用阅读function的DataView Wrapper 。
JavaScript对原始二进制数据的支持很less。 一般来说,最好在这个限制内生活。 然而,我正在考虑尝试一个我的项目,涉及操纵庞大的位图在OLAP数据库中进行设置操作。 这在IE中不起作用 。
其基本思想是:将二进制数据强制转换为PNG,将其发送到JavaScript。例如,位图可能是黑白PNG,黑色是100%透明的。 然后使用Canvas操作来进行按位数据操作。
HTML5 Canvas包含一个像素数组types ,允许访问图像中的字节。 Canvas也支持合成操作,比如XOR。 变暗和变暗应该可以做AND和OR。 任何支持这些操作的浏览器都可能使用GPU来优化这些操作。
如果有人试过这个,请告诉我它的效果如何。
这将是另一种方式… pow
和squareroot
可能由math类计算…我不知道这是否是最快的方式,但它的速度与Windows程序员视图中的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(ij != 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; }
发现这个: https : //github.com/vjeux/jParser
在不久的将来,您将能够使用ArrayBuffers和File API Blob 。
正如@Zippy在评论中指出的那样,最近(2016年末)的解决scheme包括:
- DataView (标准)
- jDataView (DataView的polyfill /扩展)
- jBinary (build立在jDataView上)
除了简单的string之外,Javascript不提供加载对象的机制。
最接近你可以做的是序列化对象到一个string,可selectencryption/压缩,发送到浏览器,并解密/解压缩,如果有必要,检查理智,eval()和祈祷()。
而不是使用eval(这不是很安全),你可以使用你自己的格式(或者有很多库的xml或json),并自己parsing它。
另外,如果在浏览器获得可用数据(解密/解压缩后)之后想要进行混淆处理,则很容易规避。
编码百分比可以忽略string到任何二进制blob的直接1 – 1表示,也可以在浏览器之间移植;
unescape("%uFFFF%uFFFF%uFFFF");
大多数浏览器漏洞利用这种技术将shellcodeembedded到HTML页面中,这对创build任意二进制stream非常有效。
jBinary “可以很容易地在浏览器和Node.js中创build,加载,parsing,修改和保存复杂的二进制文件和数据结构。
我没有使用它,但这是我在问这里所问的同一个问题时发现的…