奇怪的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