使用节点缓冲区在utf-8中进行字符串序列化



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

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

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

客户端使用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在服务器和客户端之间序列化缓冲区,我知道我会得到正确的输出,但对于我的项目来说,如果客户端能够使用utf8计算出序列化缓冲区的startHex,那就更容易了。原因是我无法访问服务器的内部工作,该服务器在发送到客户端之前实际调用buffer.toString(),因此我无法更改编码。

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

最新更新