nodejs Buffer toString更改了原始缓冲区

时间:2017-11-03 05:27:49

标签: node.js buffer encode

node.js中的

    const buffer = Buffer.from('000000a6', 'hex');
    console.log(buffer); // <Buffer 00 00 00 a6>

    const bufferString = buffer.toString();
    const newBuffer = Buffer.from(bufferString);
    console.log(newBuffer); //  <Buffer 00 00 00 ef bf bd>

为什么将缓冲区转换为字符串,然后将字符串转换回缓冲区,新缓冲区与原始缓冲区不同?

我尝试了toString('hex')toString('binary')或其他编码,如ascii等。所有这些编码都改变了原始缓冲区。

buffer.toString(encode)使用默认编码utf8,Buffer.from(string,encode)也使用默认编码utf8,它仍然不同。

如何将缓冲区转换为字符串,并将其转换回与原始缓冲区完全相同的缓冲区?

PS:这个问题来自于我想将请求体作为缓冲区发送的时候。我只是发送到服务器,但服务器得到。

PPS:服务器不在我的掌控之中。所以我无法使用Buffer.from(string,'hex')来解析请求体buffer.toString('hex')。

2 个答案:

答案 0 :(得分:0)

无需像const bufferString = buffer.toString();

那样转换为字符串

const buffer = Buffer.from('000000a6','hex');     的console.log(缓冲液); //

const bufferString = buffer; 
const newBuffer = Buffer.from(bufferString);
console.log(newBuffer);

答案 1 :(得分:0)

换句话说,您正在两次使用相同的编码将缓冲区转换为字符串,然后又转换回缓冲区,并且缓冲区是否不相同?这是一个测试输入字符串在给定编码下是否保持不变的函数。这应该告诉您哪些编码可能有问题。

var f = (buf, enc) => Buffer.from(buf.toString(enc), enc).every((e,i) => e === buf[i]);
f("hello world", "utf16le"); // ==> returns true
f("hello world", "binary"); // ==> returns true

UTF8是默认编码(如果您未指定一种编码),因此原始答案中的Buffer序列很可能是错误的UTF8,或者需要以其他方式进行转义以将其正确映射到UTF8字符串。