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



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

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

下面是一个将类型数组(可能是小端字节序或大端字节序)转换为大端字节序的 Uint8Array(相当于 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)

现在,您可以将该数组传递到节点文件写入方法中,因为它与 Node 的Buffer对象兼容Uint8Array。例如,如果您已经打开了一个文件并具有该文件的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,因为这是默认值。


(有关本文写入部分的更多详细信息,请参阅:在 Node.js 中写入文件)

最新更新