我有一个使用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
我的问题是为什么startHex
和endHex
不同?它们不仅不同。它们看起来很相似,只是endHex
有额外的字符。如果我使用base64
或binary
在服务器和客户端之间序列化缓冲区,我知道我会得到正确的输出,但对于我的项目来说,如果客户端能够使用utf8
计算出序列化缓冲区的startHex
,那就更容易了。原因是我无法访问服务器的内部工作,该服务器在发送到客户端之前实际调用buffer.toString()
,因此我无法更改编码。
原始输入中有无效的UTF-8字符。无效的UTF-8替换字符具有字节EFBFBD,您可以在输出中多次看到这种情况。