我在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>
答案 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