【问题标题】:String Serialization in utf-8 using Node Buffer使用节点缓冲区在 utf-8 中进行字符串序列化
【发布时间】:2017-01-31 22:41:58
【问题描述】:

我有一个使用 unhex('6BFD3D0AFDFD4E01FDFD67703A34757F') 存储 blob 的 sql 数据库。

服务器检索 blob 并将其作为 <Buffer 6b 8a 3d 0a 9b eb 4e 01 96 a6 67 70 3a 34 75 7f> 存储在节点缓冲区中。

服务器序列化缓冲区并使用buffer.toString() 将其发送到客户端,默认为utf8 编码。

客户端使用Buffer.from(buffer, 'utf8')接收和反序列化缓冲区,结果为<Buffer 6b ef bf bd 3d 0a ef bf bd ef bf bd 4e 01 ef bf bd ef bf bd 67 70 3a 34 75 7f>,然后如果我使用.toString('hex')将其转换回十六进制,我得到6BEFBFBD3D0AEFBFBDEFBFBD4E01EFBFBDEFBFBD67703A34757F

总结一下,如果我这样做了:

let startHex = "6BFD3D0AFDFD4E01FDFD67703A34757F"
let buffer = Buffer.from(hex, 'hex')
let endHex = Buffer.from(buffer.toString()).toString('hex').toUpperCase())
console.log(endHex)

输出是:

6BEFBFBD3D0AEFBFBDEFBFBD4E01EFBFBDEFBFBD67703A34757F

我的问题是为什么startHexendHex 不同?它们不仅不同。除了 endHex 有多余的字符外,它们看起来很相似。我知道如果我使用base64binary 序列化服务器和客户端之间的缓冲区,我会得到正确的输出,但是对于我的项目,如果客户端能够在使用序列化缓冲区的情况下找出startHex 会更容易utf8。原因是在发送到客户端之前我无法访问实际调用buffer.toString()的服务器的内部工作,所以我无法更改编码。

【问题讨论】:

    标签: sql node.js utf-8 hex buffer


    【解决方案1】:

    您的原始输入中有无效的 UTF-8 字符。无效的 UTF-8 替换字符包含字节 EFBFBD,您可以在输出中多次看到。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-03-14
      • 2016-05-06
      • 1970-01-01
      • 2016-09-23
      相关资源
      最近更新 更多