节点 - 如何将类型化数组写入具有指定字节顺序的二进制文件
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)
我有一个类型化数组,我想将它写入一个二进制文件。我需要它以大端字节顺序排列,但我可能不会(通常不会)在大端机器上。如何从我的类型化数组获取二进制文件?
如您所知,在 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)