在DataView中存储缓冲区,然后用Float64Array解压缩不起作用

我想写一个缓冲区到数组中,然后用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 

由于字节序的问题 。 使用节点缓冲区 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 

如果你知道更多,请随时纠正/延长。

我最终意识到数据需要被正确的读入“INTO”视图。 在我提供的例子中,这意味着两个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++; }