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')。
答案 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字符串。