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

时间:2014-07-08 00:15:49

标签: javascript node.js

我在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的真,但是假127-255 任何人都可以告诉我这些方法有什么不同,以及如何将Buffer转换为String,以便可以再次成为Buffer

//修改

相同
new Buffer('\u0079')

返回

<Buffer 79>

,而

new Buffer('\u0080')

返回

<Buffer c2 80>

2 个答案:

答案 0 :(得分:1)

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

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

Wikipedia gives a good explanation here

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

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

答案 1 :(得分:1)

我最近遇到了同样的问题。要回答您的问题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