奇怪的Node.js Buffer.toString()行为

Weird Node.js Buffer.toString() behaviour

本文关键字:toString 行为 Buffer js Node      更新时间:2023-09-26

我在将Buffer转换为String或其他方式时遇到了一些问题。

当我做了

var b = new Buffer(4);
b.writeInt32BE(1000);
var c = new Buffer(b.toString());

返回了一个完全不同的值。所以我做了一个小测试

for(var i = 0; i < 255; i++){
    var a = String.fromCharCode(i);
    console.log(i + " " + (new Buffer(a)[0] == a.charCodeAt(0)));
 }

0-126返回true, 127-255返回false有谁能告诉我这两种方法有什么不同,怎么把Buffer变成String,再变成Buffer ?

//编辑

也一样
new Buffer(''u0079')

返回
<Buffer 79>

,

new Buffer(''u0080')

返回
<Buffer c2 80>

您没有考虑到该节点在将二进制数据转换为字符串时使用的字符编码。默认使用UTF-8。

UTF-8将编码为<128以便它映射到相同的字符代码。然而,对于128及以上,它将对其进行编码——基本上,第一个位设置为1的字节在UTF-8编码中是特殊的。UTF-8也适用于多字节序列,因此它在编码时处理两种类型的集合。

维基百科给出了很好的解释

十进制1000,即十六进制0x3e8,因此在utf-8编码时将产生以下字节:

如果您再次使用UTF-8从字符串解码到缓冲区,它应该正确往返。您还可以在调用Buffer构造函数或toString方法时指定不同的编码,详细信息请参阅节点文档。

我最近也遇到了同样的问题。要回答您的问题how to turn Buffer into String so it can be made a Buffer again,您需要将其转换为base64编码的字符串。这样你就不会丢失任何数据了:

buf = Buffer(4)
buf.fill(128)
base64String = buf.toString('base64')
newBuf = Buffer(base64String, 'base64')
buf.equals(newBuf) //true