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

我已经有一些问题,使Buffer成为String和其他方式。

当我做了

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

它已经返回了完全不同的价值。 所以我做了一个小testing

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

它返回true为0-126,但错误127-255谁能告诉我这些方法有什么区别,以及如何将Buffer变成String所以它可以再次成为一个Buffer

//编辑

同样的

 new Buffer('\u0079') 

回报

 <Buffer 79> 

 new Buffer('\u0080') 

回报

 <Buffer c2 80> 

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

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

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

十进制1000,即hex0x3e8,因此在utf-8编码时将导致以下字节:DF 98

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

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

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