将 Buffer.from() 与 fs.readFileSync() 的内容一起使用可生成包含不同数据的缓冲区

Using Buffer.from() with the contents of fs.readFileSync() makes a buffer with different data

let fb = fs.readFileSync(filePath);
let fileData = fb.toString("utf8");
b = Buffer.from(fileData, "utf8");
console.log(fb);
console.log(b);
console.log(b == fb);
console.log(b.toString("utf8") === fb.toString("utf8"));

我将缓冲区转换为 UTF8 字符串并再次尝试使用 Buffer.from() 取回缓冲区,但我可以看到两个缓冲区不同。但是,如果我再次比较这两个缓冲区的 toString() 结果,它们是相同的。

以上程序的输出

如果 fileData 不是完全合法的 UTF8,则根据 buffer.toString() doc:

If encoding is 'utf8' and a byte sequence in the input is not valid UTF-8, then each invalid byte is replaced with the replacement character U+FFFD.

因此,如果您转换为字符串然后返回缓冲区并且编码不是完美的 utf8 开始,则该过程不可逆,因为一些非法的 utf8 字节将被替换。

比较两个 .toString('utf8') 结果将各自包含相同的“固定”版本(替换字节)。

这里的关键是不要将缓冲区转换为 utf8 字符串,除非它是真正合法的 utf8 数据。