为何同一字符串生成的Buffer不同?Node.js字符串转Buffer问题
问题分析与解决办法
嘿,我来帮你捋清楚这个问题的核心原因,以及对应的解决办法~
为什么直接写代码里和读文本文件结果不一样?
你代码里写的\xf5\x89...这种转义序列,Node.js在解析代码的时候会自动把它们转换成对应的字节/字符;但当你把这段内容写到文本文件里时,文件里存储的其实是普通的字符串字符——也就是\、x、f、5这些单个字符,而不是对应的字节。
所以当你从文本文件读取后再转Buffer时,Node.js会把这些普通字符转成它们各自的ASCII码(比如\对应0x5c,x对应0x78),结果自然和直接写在代码里的Buffer完全不同。
两种场景的解决办法
场景1:文本文件存储的是原始二进制字节
如果你的文本文件其实是二进制格式(只是用文本编辑器打开显示成了转义字符),那根本不需要转成字符串再转Buffer,直接读取二进制数据即可:
const fs = require('fs'); // 用encoding: null直接读取原始Buffer fs.readFile('your-file-path.txt', { encoding: null }, (err, buf) => { if (err) throw err; console.log(buf); // 这就是和代码里直接转换一致的结果 });
场景2:文本文件里确实是写的\xf5\x89...这种转义字符串
如果文件里就是以文本形式存储的转义序列,那需要先把这些转义字符解析成对应的字节,再转Buffer:
const fs = require('fs'); fs.readFile('your-file-path.txt', 'utf8', (err, rawData) => { if (err) throw err; // 安全解析十六进制转义序列 const parsedString = rawData.replace(/\\x([0-9a-fA-F]{2})/g, (_, hex) => { return String.fromCharCode(parseInt(hex, 16)); }); // 用latin1编码转Buffer(单字节映射,不会丢失数据) const buf = Buffer.from(parsedString, 'latin1'); console.log(buf); });
额外提醒
如果是要存储二进制数据,尽量不要用文本文件存储,直接保存为二进制文件能避免很多转义、编码的坑,读取时也更高效。
内容的提问来源于stack exchange,提问作者Abdul Alim Shakir
相关产品推荐
相关产品推荐

