You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.28 08:24:08