节点 - 如何将类型化数组写入具有指定字节顺序的二进制文件

时间:2018-04-14 10:10:17

标签: javascript node.js binary endianness typed-arrays

我有一个打字数组,我想把它写成二进制文件。我需要它以big-endian字节顺序,但我可能不会(通常不会)在big-endian机器上。如何从我的类型数组到二进制文件?

1 个答案:

答案 0 :(得分:1)

您可能知道,在javascript中强制执行endianness的方法是使用DataView视图。一旦创建了缓冲区的DataView视图,就可以用big-endian或little-endian字节顺序设置和获取数据。

这是一个将类型化数组(可能是小端或大端字节顺序)转换为Und8Array(相当于Node的'文件'缓冲区)的大端字节顺序的示例。请注意,由于dataView只是底层缓冲区的一个视图,原始数组arr现在是字节交换的,我们将写入文件。

arr = new Float32Array([42]) // one value
dataView = new DataView(arr.buffer)
dataView.setFloat32(0, arr[0], false /* big-endian */)
buf = new Uint8Array(arr.buffer)

现在您可以将该Array传递给节点文件写入方法,因为Uint8Array与Node的Buffer对象兼容。例如,如果您已经打开了一个文件并且有fd,那么您可以这样做:

fs.writeSync(fd, buf)

为了完整起见,这里的示例代码处理您将实际使用Float32类型数据的循环:

arr = new Float32Array([...]) // some initial data
...
dataView = new DataView(arr.buffer)
byteNum = 0;
for (let i = 0; i < arr.length; i++) {
  dataView.setFloat32(byteNum, arr[i]);
  byteNum += Float32Array.BYTES_PER_ELEMENT;
}

buf = new Uint8Array(arr.buffer)
fs.writeSync(fd, buf)

请注意,上面我没有将false传递给setFloat32,因为这是默认设置。

(有关写作部分的详细信息,请参阅:Writing files in Node.js