如何让JavaScript实现与PHP一致的hex2bin和base64_encode效果?
修复Node.js与PHP十六进制转Base64结果不一致的问题
给定十六进制源字符串:6b80b4ea6ebd435cbe6068aaaf2f6715,PHP通过hex2bin和base64_encode处理后得到结果:a4C06m69Q1y+YGiqry9nFQ==,但原有Node.js代码输出结果不一致,以下是修复方案:
原有Node.js代码的问题
- 自定义
hex2bin函数用String.fromCharCode转换字节为字符串,会将原始字节按UTF-16编码解析,和PHPhex2bin返回的原始二进制字节流逻辑不符。 - Base64编码步骤错误:
Buffer.from(hex).toString('base64')是直接把十六进制字符串当普通字符转Buffer再编码,而非先将十六进制解析为原始字节流。
修改后的简洁Node.js代码
const hex = "6b80b4ea6ebd435cbe6068aaaf2f6715"; console.log('hex ' + hex); // 用Buffer内置的十六进制解析能力获取原始字节流 const buffer = Buffer.from(hex, 'hex'); // 模拟PHP hex2bin的输出(原始字节转字符串,不可打印字符显示为乱码) console.log('hex2bin ' + buffer.toString('binary')); // 生成与PHP一致的Base64结果 console.log('base64_encode ' + buffer.toString('base64'));
代码说明
- 十六进制转原始字节:
Buffer.from(hex, 'hex')直接将十六进制字符串解析为对应原始字节流,和PHPhex2bin行为完全一致。 - 模拟hex2bin输出:PHP中
hex2bin输出时会将每个字节按ASCII字符显示(不可打印字符为乱码),buffer.toString('binary')可以模拟这一输出效果。 - Base64编码:直接对解析后的Buffer调用
toString('base64'),得到和PHPbase64_encode完全相同的结果:a4C06m69Q1y+YGiqry9nFQ==。
内容的提问来源于stack exchange,提问作者Ant Sot
相关产品推荐
相关产品推荐

