Node.js如何将Uint16Array等类型化数组写入二进制文件并正确读取
问题原因
- 错误指定写入编码:
fs.writeFileSync传入'binary'编码参数时,会将输入的Uint16Array按单字节Latin1规则转成字符串再写入,直接破坏了原有16位整数的二进制结构,这是数据错位的核心原因。 - 直接用Node.js Buffer实例化
Uint16Array存在隐式风险:fs.readFileSync返回的是Node.js专属的Buffer类型(本质是带偏移的Uint8Array子类),直接传入Uint16Array构造函数在无偏移场景下可以运行,但如果Buffer存在起始偏移就会出现数据错误,更稳妥的方式是显式调用其底层ArrayBuffer来构造。
正确实现代码
const fs = require('fs') const bufferPath = './test.bin' // 原始Uint16Array const originBuffer = new Uint16Array([ 60891, 11722 ]) // 写入:不要加任何编码参数,直接传入TypedArray即可 fs.writeFileSync(bufferPath, originBuffer) // 读取 const loadedBuffer = fs.readFileSync(bufferPath) // 显式基于读取到的Buffer的底层ArrayBuffer构造Uint16Array const restoredBuffer = new Uint16Array(loadedBuffer.buffer, loadedBuffer.byteOffset, loadedBuffer.byteLength / Uint16Array.BYTES_PER_ELEMENT) console.log(restoredBuffer) // 输出 Uint16Array(2) [ 60891, 11722 ]
跨平台兼容说明
如果你需要在不同字节序的设备之间读写该二进制文件,需要显式指定大端/小端序写入和读取,避免字节序错位:
- 写入时用
DataView显式按指定字节序写入每个16位整数 - 读取时同样用
DataView按相同字节序读取每个整数
内容的提问来源于stack exchange,提问作者Dianne
相关产品推荐
相关产品推荐

