如何获取javascript 64bit浮点数的实际字节数

axa*_*ire 3 javascript arrays node.js typed-arrays

我一直在尝试研究如何在JavaScript中使用类型数组,但是我还没有点击.我不明白如何正确地读/写"视图".

var a = 23453.342;
Run Code Online (Sandbox Code Playgroud)

现在让我们说我想将它存储在一个Float64Array类型的数组中

view[0] = ??? //how do I copy the bytes that represent variable a into here.
Run Code Online (Sandbox Code Playgroud)

另外,假设我想将内部JavaScript中的整数123456存储为64位浮点数:

var i = 123456;
Run Code Online (Sandbox Code Playgroud)

但我想把它存储好像它真的是一个4字节的整数.

var buff = new ArrayBuffer(4);
var view = new UInt32Array(buff);

view[0] = ???; //how do i determine and write the 4 bytes that would represent the value of i.
Run Code Online (Sandbox Code Playgroud)

然后在这两种情况下,一旦我能够写入数据,我如何在JavaScript中将其读回到局部变量中.

Pat*_*ans 5

如果你的值小于Typed Array单元而不是将值存储到数组中,例如你有23453.342并使用Float64,那么只需将它放入数组中

var view = new Float64Array(1);
view[0] = 23453.342;
Run Code Online (Sandbox Code Playgroud)

现在,如果您想将数字转换为单个字节,例如32位数字并获得4个字节,则可以使用两个TypedArray视图.将您的值放入较高位数组,并从较低位单元读取字节.

//The argument passed to ArrayBuffer constructor 
//is number of Bytes the buffer should be
var buff = new ArrayBuffer(4);
//Since buffer was made for 4 bytes, this view can read/store 1 32bit value
var view = new Uint32Array(buff);
//buffer still has 4 bytes, so this view can read/store 4 8bit values
var view2 = new Uint8Array(buff);

view[0] = 123456;
console.log(view2);
Run Code Online (Sandbox Code Playgroud)

如果要手动获取字节,或者无法访问更高单元类型的数组,则可以使用位移和按位AND运算符来获取单个字节

var i = 123456;

var buff = new ArrayBuffer(4);
var view = new Uint32Array(buff);
var view2 = new Uint8Array(buff);

view2[0] = i & 0x000000FF;
view2[1] = (i & 0x0000FF00) >> 8;
view2[2] = (i & 0x00FF0000) >> 16;
view2[3] = (i & 0xFF000000) >> 24; 

console.log( view2, view[0] );
Run Code Online (Sandbox Code Playgroud)

至于将值取回,在使用两个类型数组的情况下,您只需读取目标单元的数组.在这种情况下,从Uint32Array中读取

var buff = new ArrayBuffer(4);
var view = new Uint32Array(buff);
var view2 = new Uint8Array(buff);
view2[0] = 64, view2[1] = 226, view2[2] = 1, view2[3] = 0;
var i = view[0];
console.log(i);
Run Code Online (Sandbox Code Playgroud)

再次,如果你想使用位移方式,你需要从较小的类型数组中移位每个字节,并将它们按位或移位在一起.

var buff = new ArrayBuffer(4);
var view = new Uint8Array(buff);
view[0] = 64, view[1] = 226, view[2] = 1, view[3] = 0;
var i = 0;
i |= view[3] << 24;
i |= view[2] << 16;
i |= view[1] << 8;
i |= view[0];
console.log(i);
Run Code Online (Sandbox Code Playgroud)