来自here:
_shl: function (a, b){
for (++b; --b; a = ((a %= 0x7fffffff + 1) & 0x40000000) == 0x40000000 ? a * 2 : (a - 0x40000000) * 2 + 0x7fffffff + 1);
return a;
},
_readByte: function (i, size) {
return this._buffer.charCodeAt(this._pos + size - i - 1) & 0xff;
},
_readBits: function (start, length, size) {
var offsetLeft = (start + length) % 8;
var offsetRight = start % 8;
var curByte = size - (start >> 3) - 1;
var lastByte = size + (-(start + length) >> 3);
var diff = curByte - lastByte;
var sum = (this._readByte(curByte, size) >> offsetRight) & ((1 << (diff ? 8 - offsetRight : length)) - 1);
if (diff && offsetLeft) {
sum += (this._readByte(lastByte++, size) & ((1 << offsetLeft) - 1)) << (diff-- << 3) - offsetRight;
}
while (diff) {
sum += this._shl(this._readByte(lastByte++, size), (diff-- << 3) - offsetRight);
}
return sum;
},
此代码执行二进制文件读取。不幸的是,这段代码没有记录。 我想了解它是如何工作的。 (尤其是_readBits和_shl方法) 在_readBits中,什么是offsetright?还有curByte和lastByte: 我这么想是这样的:
_readBits(0,16,2)curByte变为1. lastByte变为0.为什么lastByte小于curByte?或者我犯了一个错误?哪里?请帮忙!
答案 0 :(得分:0)
_readByte(i, size)
:size
是以字节为单位的缓冲区长度,i
是反向索引(从缓冲区末尾开始的索引,而不是从开头)你想要阅读的字节。_readBits(start, length, size)
:size
是以字节为单位的缓冲区长度,length
是您要读取的位数,start
是索引< / strong>您想要阅读的第一位。_shl(a, b)
:根据索引a
将读取字节b
转换为实际值。由于_readByte
使用了反向索引,因此lastByte
小于curByte
。
offsetLeft
和offsetRight
用于分别从lastByte
和curByte
删除不相关的位(不在读取范围内的位)。
答案 1 :(得分:0)
我不确定代码是如何跨浏览器的。我已经使用下面的方法来读取二进制数据。 IE有一些问题只能用Javascript解决,你需要一个用VB编写的小帮助函数。 Here是一个完全跨浏览器的二进制阅读器类。如果你只想要没有所有辅助功能的重要位,只需将它添加到需要读取二进制的类的末尾:
// Add the helper functions in vbscript for IE browsers
// From https://gist.github.com/161492
if ($.browser.msie) {
document.write(
"<script type='text/vbscript'>\r\n"
+ "Function IEBinary_getByteAt(strBinary, iOffset)\r\n"
+ " IEBinary_getByteAt = AscB(MidB(strBinary,iOffset+1,1))\r\n"
+ "End Function\r\n"
+ "Function IEBinary_getLength(strBinary)\r\n"
+ " IEBinary_getLength = LenB(strBinary)\r\n"
+ "End Function\r\n"
+ "</script>\r\n"
);
}
然后你可以在课堂上选择最新的内容:
// Define the binary accessor function
if ($.browser.msie) {
this.getByteAt = function(binData, offset) {
return IEBinary_getByteAt(binData, offset);
}
} else {
this.getByteAt = function(binData, offset) {
return binData.charCodeAt(offset) & 0xFF;
}
}
现在您可以阅读所有想要的字节
var byte = getByteAt.call(this, rawData, dataPos);
答案 2 :(得分:0)
我找到了这个,并且记录得很清楚:https://github.com/vjeux/jParser