【问题标题】:nodejs Buffer toString changed original buffernodejs Buffer toString 改变了原来的缓冲区
【发布时间】:2018-04-15 18:53:20
【问题描述】:

在 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>

为什么先把buffer转成string,再把string转回buffer,新的buffer和原来的不一样?

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

buffer.toString(encode) 使用默认的encode utf8,Buffer.from(string, encode) 也使用默认的encode utf8,还是有区别的。

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

PS:这个问题来自于我想将请求正文作为缓冲区发送时。我只是发送到服务器,但服务器获取。

PPS:服务器不在我的控制范围内。所以我不能使用 Buffer.from(string, 'hex') 来解析请求体 buffer.toString('hex')。

【问题讨论】:

    标签: node.js buffer encode


    【解决方案1】:

    不需要像 const bufferString = buffer.toString(); 那样转换成字符串

    const buffer = Buffer.from('000000a6', 'hex'); 控制台.log(缓冲区); //

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

    【讨论】:

    • 当我发送请求时,request.body 会使用 buffer.toString() 自动将缓冲区转换为字符串,我没有手动执行此操作。并且字符串会被服务器接收到,但是字符串已经改变了
    【解决方案2】:

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

    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,则默认编码是UTF8,因此原始答案中的缓冲区序列很可能是错误的UTF8,或者需要以其他方式转义才能正确映射到UTF8字符串。

    【讨论】:

    • 我不明白如何编码然后解码不能是每个编码的透明操作。我们基本上是在取位,对它们进行分组,并赋予它们等效的字符。然后进行反向操作。那么这些位什么时候改变呢?
    猜你喜欢
    • 1970-01-01
    • 2013-02-10
    • 1970-01-01
    • 2017-03-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-07
    • 1970-01-01
    相关资源
    最近更新 更多