Noitidart
Noitidart

Reputation: 37238

Node.js Buffer from string not correct

To create a utf-8 buffer from a string in javascript on the web you do this:

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

This logs:

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

However in Node.js if I do this:

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

it logs this:

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

The byteLength is way to high. Am I doing something wrong here?

Thanks

Upvotes: 1

Views: 2908

Answers (1)

Jeonghyeon Lee
Jeonghyeon Lee

Reputation: 244

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

ArrayBuffer.prototype.byteLength Read only
The size, in bytes, of the array. This is established when the array is constructed and cannot be changed. Read only.

It seems you should not assume byteLength property to be equal to the actual byte length occupied by the elements in the ArrayBuffer.

In order to get the actual byte length, I suggest using Buffer.byteLength(string[, encoding])

Documentation: https://nodejs.org/api/buffer.html#buffer_class_method_buffer_bytelength_string_encoding

For example,

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

correctly gives

byteLength: 6

Upvotes: 2

Related Questions