Node.js来自字符串的缓冲区不正确

时间:2017-01-26 05:42:18

标签: node.js

要在网络上的javascript中使用字符串创建utf-8缓冲区,请执行以下操作:

var message = JSON.stringify('ping');
var buf = new TextEncoder().encode(message).buffer;
console.log('buf:', buf);
console.log('buf.buffer.byteLength:', buf.byteLength);

此日志:

buf: ArrayBuffer { byteLength: 6 } 
buf.buffer.byteLength: 6

但是在Node.js中如果我这样做:

var nbuf = Buffer.from(message, 'utf8');
console.log('nbuf:', nbuf);
console.log('nbuf.buffer:', nbuf.buffer);
console.log('nbuf.buffer.byteLength:', nbuf.buffer.byteLength);

记录下来:

nbuf: <Buffer 22 70 69 6e 67 22>
nbuf.buffer: ArrayBuffer { byteLength: 8192 }
nbuf.buffer.byteLength: 8192

byteLength是通向高的方式。我在这里做错了吗?

由于

1 个答案:

答案 0 :(得分:2)

https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/ArrayBuffer

  

ArrayBuffer.prototype.byteLength只读
  数组的大小(以字节为单位)。这是在构造数组时建立的,无法更改。只读。

您似乎不应假设byteLength属性等于ArrayBuffer中元素占用的实际字节长度。

为了获得实际的字节长度,我建议使用Buffer.byteLength(string[, encoding])

文档:https://nodejs.org/api/buffer.html#buffer_class_method_buffer_bytelength_string_encoding

例如,

var message = JSON.stringify('ping');
console.log('byteLength: ', Buffer.byteLength(message));

正确给出

  

byteLength:6