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