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

Node - How to write a typed array to a binary file with a specified endianness

我有一个类型化数组,我想将它写入一个二进制文件。我需要它以大端字节顺序排列,但我可能不会(通常不会)在大端机器上。如何从我的类型化数组获取二进制文件?

如您所知,在 javascript 中强制执行字节顺序的方法是使用 DataView 视图。创建缓冲区的 DataView 视图后,您可以按大端或小端字节顺序设置和获取数据。

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

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

现在您可以将该数组传递给节点文件写入方法,因为 Uint8Array 与节点的 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