Node.js中hex转Buffer经utf-8中转后转回hex内容不一致如何解决
问题根因
你遇到的转换偏差是因为非法UTF-8字节被自动替换导致的:
UTF-8是变长编码规则,单字节合法范围为0x00~0x7F,你原始Buffer里的0x85不属于合法UTF-8单字节序列,调用toString('utf-8')时,Node.js会自动将非法字节替换为U+FFFD替换字符,该字符对应的UTF-8编码就是0xEF 0xBF 0xBD,也就是你看到输出里的EFBFBD。
这种方式本质是用文本编码去处理二进制内容,必然会出现信息损失。
无损传输实现方案
不要用UTF-8编码转换二进制Buffer,选择专门用于二进制转文本的编码格式即可,以下是两种主流实现:
方案1:Base64编码(推荐,传输效率高)
Base64编码后长度为原始数据的4/3,是二进制内容字符串传输的通用方案,实现代码如下:
const hex_message = "7E01000036015211601385025E"; const chunk = Buffer.from(hex_message, 'hex'); // 发送端:Buffer转Base64字符串 const transmitStr = chunk.toString('base64'); // 接收端:Base64字符串还原Buffer const restoredBuf = Buffer.from(transmitStr, 'base64'); const restoredHex = restoredBuf.toString('hex').toUpperCase(); // 输出:7E01000036015211601385025E,和原始内容完全一致
方案2:Hex编码(可读性高)
如果需要传输后的字符串可以直接看到原始字节值,可以选择Hex编码,编码后长度为原始数据的2倍,实现代码如下:
const hex_message = "7E01000036015211601385025E"; const chunk = Buffer.from(hex_message, 'hex'); // 发送端:Buffer转Hex字符串 const transmitStr = chunk.toString('hex'); // 接收端:Hex字符串还原Buffer const restoredBuf = Buffer.from(transmitStr, 'hex'); const restoredHex = restoredBuf.toString('hex').toUpperCase(); // 输出:7E01000036015211601385025E,和原始内容完全一致
方案选择建议
- 微服务跨进程传输的通用场景优先选Base64,传输效率更高
- 如果有调试、人工查看传输内容的需求,可选择Hex编码
内容的提问来源于stack exchange,提问作者dlopezgonzalez
相关产品推荐
相关产品推荐

