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

Node.js如何实现与C# File.WriteAllBytes等效的二进制文件写入

问题根因

核心错误是写入时错误将Buffer转为字符串:
你代码里的`${data}`会隐式调用Buffer的toString()方法,默认以UTF-8编码解析二进制内容。字节值164(0xA4)属于大于127的非ASCII单字节,不符合UTF-8编码规则,会被替换为Unicode替换字符�(U+FFFD),最终写入文件的是该字符对应的3个UTF-8字节:0xEF 0xBF 0xBD,也就是你看到的乱码ן¿½。

纠正你的错误判断:C#的File.WriteAllBytes没有做任何十六进制转换,就是把字节数组的每个8位原始值直接写入文件,无额外编码处理。你看到的₪只是查看文件时使用的本地代码页编码解析0xA4字节得到的显示结果,不是C#做了特殊转换。

修复方案

fs.appendFile原生支持直接写入Buffer类型数据,会原样写入Buffer内的所有字节,和C#写入行为完全一致,不需要做任何字符串转换。
修正后的写入逻辑如下:

const fsp = require("fs").promises;
const path = require("path");

const writeDataToFileFile = async (data) => {
  const appTempPath = app.getPath("temp");
  const pathToWrite = path.join(appTempPath, "test.bin");
  // 直接传入Buffer实例,禁止转字符串
  await fsp.appendFile(pathToWrite, data);
};

// 测试数组
const arr = [
    78, 51, 49, 48, 48, 48, 85, 49, 164, 0, 67, 54, 52, 49, 53, 57, 52, 57, 52,
    66, 52, 50, 49, 48, 69, 57, 70, 69, 55, 70, 50, 52, 70, 48, 69, 52, 70, 70,
    50, 67, 67, 55, 50, 67, 69, 54, 53, 56, 66, 67, 53, 66,
];
const bufferFromArr = Buffer.from(arr);
await writeDataToFileFile(bufferFromArr);
注意事项
  • Buffer.from(arr)生成的二进制数据本身和C#的字节数组完全一致,控制台打印Buffer时看到乱码,是控制台默认用UTF-8解码二进制内容导致的显示问题,不代表Buffer内存储的数据错误。
  • 循环追加写入时,每次传入正确构造的Buffer即可,不要做任何编码转换、字符串拼接操作,就能保证字节写入完全准确。
  • 写入完成后可以通过二进制哈希校验对比两个文件,结果会完全一致。你看到的文本显示差异只是打开文件时选用的解码编码不同导致的,不影响二进制内容的一致性。

内容的提问来源于stack exchange,提问作者ATT

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.30 19:36:34