Node.js中Base64转原始二进制数据错误的技术求助
问题:Base64转原始二进制数据不符合预期
我在第三方平台的定制化Node.js环境中编写业务脚本,需要将Base64字符串转为原始加密二进制数据并赋值给classA.data.raw,但转换结果不符合预期。
相关信息
- 示例Base64数据:
nzx4qnf7g23hNvS1Fj4iMU56uGwhCY7CazUsEt5gPOs= - 预期原始二进制形式(Python bytes表示):
b'\x9f<x\xaaw\xfb\x83m\xe16\xf4\xb5\x16>"1Nz\xb8l!\t\x8e\xc2k5,\x12\xde`<\xeb' - 当前使用的脚本:
var encryped_b64 = 'nzx4qnf7g23hNvS1Fj4iMU56uGwhCY7CazUsEt5gPOs='; classA.data.raw = Buffer.from(encryped_b64 , 'base64').toString('binary'); classA.send_data(); - 实际转换结果(Python bytes表示):
b'\xc2\x9f<x\xc2\xaaw\xc3\xbb\xc2\x83m\xc3\xa16\xc3\xb4\xc2\xb5\x16>"1Nz\xc2\xb8l!\t\xc2\x8e\xc3\x82k5,\x12\xc3\x9e`<\xc3\xab'
解决方案
问题出在你调用了toString('binary')——Node.js中Buffer.toString('binary')实际上是将字节编码为Latin-1字符集,这会导致原本的单字节值被转成多字节的UTF-8编码(比如0x9f变成\xc2\x9f),破坏了原始二进制数据结构。
直接将Base64解析后的Buffer对象赋值给classA.data.raw即可,不需要转成字符串:
var encryped_b64 = 'nzx4qnf7g23hNvS1Fj4iMU56uGwhCY7CazUsEt5gPOs='; classA.data.raw = Buffer.from(encryped_b64, 'base64'); classA.send_data();
如果定制化环境不允许直接赋值Buffer,尝试将Buffer转为Uint8Array(原始字节数组):
var encryped_b64 = 'nzx4qnf7g23hNvS1Fj4iMU56uGwhCY7CazUsEt5gPOs='; classA.data.raw = new Uint8Array(Buffer.from(encryped_b64, 'base64')); classA.send_data();
原理是:Buffer.from(b64, 'base64')已经直接解析出了原始的二进制字节,转字符串会引入编码转换,只有直接传递Buffer或Uint8Array才能保留预期的二进制字节。
内容的提问来源于stack exchange,提问作者Kulo
相关产品推荐
相关产品推荐

