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
相关产品推荐
相关产品推荐

