将缓冲区存储在DataView中,然后在Float64Array不工作的情况下提取

Store buffer in DataView then extract with Float64Array not working

本文关键字:工作 Float64Array 情况下 提取 存储 缓冲区 DataView 然后      更新时间:2023-09-26

我想将缓冲区写入数组,然后使用Float64Array视图访问该数组。这似乎比它应该做的要困难得多。我使用了mozilla文档,但仍然存在问题。。。。

我已经尝试了以下的多种变体。有人知道为什么不起作用吗?最后,我应该能够打印出第一个浮动,即4。

//64 bit floating point numbers with 8 bytes each in hex
//first  float64 bytes : 4 = 0x4010000000000000
//second float64 bytes : 5 = 0x4014000000000000
//2 x 8 bytes in a buffer with each hex number
var buff = new Buffer("40100000000000004014000000000000", "hex");
var ab = new ArrayBuffer(buff.length);
var view = new DataView(ab);
for (var i = 0; i < buff.length; ++i) {
    view[i] = buff[i];
}
console.log(new Float64Array(ab).length);//prints 2
console.log(new Float64Array(ab)[0]);// SHOULD print '4' but prints 0

由于endianness导致的问题。使用节点缓冲区API:

var buff = new Buffer("40100000000000004014000000000000", "hex");
buff.readDoubleLE(0) // 2.0553e-320
buff.readDoubleBE(0) // 4

如果我们反向buff并从第8字节读取:

var buffRev = new Buffer("00000000000014400000000000001040", "hex")
buff.readDoubleLE(8) // 4
buff.readDoubleBE(8) // 2.0553e-320

如果您了解更多,请随时更正/扩展。

我最终意识到,实际上数据需要以正确的块读取视图。在我提供的示例中,这意味着两次读取8个字节。每次读取都需要填充Float64Array中的一个项目。令人惊讶的是,这并不容易,而且我不能用整个底层缓冲区来填充ArrayBuffer。

不管怎样,这就是我的结局。。。

var buff = new Buffer("40100000000000004014000000000000", "hex");
var ab = new ArrayBuffer(buff.length);
var view = new Float64Array(ab);
var viewIndex = 0;
for (var bufferIndex=0;bufferIndex<buff.length;bufferIndex=bufferIndex+8)            {
    view[viewIndex] = buff.readDoubleLE(bufferIndex);
    viewIndex++;
}