JavaScript:将3个字节的缓冲区作为整数读取

22

假设我有一个十六进制数据流,我想将其分成3字节块,并将其读取为一个整数。

例如:给定一个十六进制字符串01be638119704d4b9a,我需要读取前三个字节01be63并将其作为整数114275读取。这是我的代码:

var sample = '01be638119704d4b9a';
var buffer = new Buffer(sample, 'hex');
var bufferChunk = buffer.slice(0, 3);
var decimal = bufferChunk.readUInt32BE(0);

readUInt32BE 对于 4 字节的数据运行得很完美,但是在这里我显然得到了:

RangeError: index out of range
  at checkOffset (buffer.js:494:11)
  at Buffer.readUInt32BE (buffer.js:568:5)

我该如何正确地将3字节读取为整数?

3个回答

43

如果您正在使用node.js v0.12+或io.js,则有buffer.readUIntBE(),它允许使用可变数量的字节:

var decimal = buffer.readUIntBE(0, 3);

请注意:对于大端序,请使用readUIntBE,对于小端序,请使用readUIntLE

否则,如果您正在使用较旧的Node版本,则必须手动执行此操作(当然首先检查范围):

var decimal = (buffer[0] << 16) + (buffer[1] << 8) + buffer[2];

谢谢!我可能错过了readUIntBE函数。它完美地工作了。 - kmachnicki
为了节省几微秒:var decimal = (((buffer[0] << 8) + (buffer[1]) << 8) + buffer[2]; - Leif Neland
小端变体:(bytes [2] << 16)|(bytes [1] << 8)| bytes [0] - Denis Gladkiy

4

我正在使用这个,如果有人发现错误,请指教;

const integer = parseInt(buffer.toString("hex"), 16)

这对我非常有效。我只想让文本类别从固定的调色板中半随机地分配一个颜色编号。 - Josh Peak
不错!@JoshPeak - Ernest Okot
这是完美的。 - iTayb

-3

你应该将三个字节转换为四个字节。

function three(var sample){
    var buffer = new Buffer(sample, 'hex');

    var buf = new Buffer(1);
    buf[0] = 0x0;

    return Buffer.concat([buf, buffer.slice(0, 3)]).readUInt32BE();
}

你可以尝试这个函数。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接