Javascript二进制文件读取

时间:2011-11-10 01:40:50

标签: javascript

来自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?或者我犯了一个错误?哪里?请帮忙!

3 个答案:

答案 0 :(得分:0)

  • _readByte(i, size)size是以字节为单位的缓冲区长度,i反向索引(从缓冲区末尾开始的索引,而不是从开头)你想要阅读的字节。
  • _readBits(start, length, size)size是以字节为单位的缓冲区长度,length是您要读取的位数,start索引< / strong>您想要阅读的第一位。
  • _shl(a, b):根据索引a将读取字节b转换为实际值。

由于_readByte使用了反向索引,因此lastByte小于curByte

offsetLeftoffsetRight用于分别从lastBytecurByte删除不相关的位(不在读取范围内的位)。

答案 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