奇怪的Node.js Buffer.toString()行为
Weird Node.js Buffer.toString() behaviour
我在将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
相关文章:
- jQuery/Javascript.toggleClass/.classList.toggle的特殊行为
- 不同浏览器中的空白字符正则表达式行为
- delete关键字在全局变量上的不同行为
- toBoolean方法类似于toString
- 在不阻止默认行为的情况下检测IE10中的缩放
- 防止默认锚点行为AngularJS
- JavaScript匿名函数行为
- java脚本在Chrome和其他浏览器中对LocaleTimeString的不同行为
- html() 的意外行为
- onmouseover事件行为不端
- 导航菜单-悬停时的背景行为怪异
- 通过JavaScript捕获并更改默认警报()行为
- javascript RegExp的奇怪行为:相同的正则表达式会产生不同的结果
- HTML文档中脚本标记的位置-<头部>&<身体>有不同的行为
- AJAX Post的奇怪Javascript/PHP行为
- Javascript不需要的关闭行为
- 奇怪的JavasScript字符串用$&替换行为;
- Jqgrid-表未显示响应行为
- Javascript toString() 奇怪的行为
- 奇怪的Node.js Buffer.toString()行为