如何在PHP中实现与Node.js Buffer.from方法相同的执行效果
问题原因
- 编码对象差异是核心问题:Node.js 中
bufname.toString('base64')是直接对Buffer.from(tagVal,'utf8')得到的原始UTF-8二进制字节做Base64编码;而你编写的PHP代码中,传给base64_encode()的是bin2hex($name)输出的十六进制字符串,而非原始字符串的二进制内容,编码对象完全不同,结果必然不一致。 - 额外说明:
Buffer.from(tagVal,'utf8')和bin2hex($name)底层读取的字节本身是一致的,仅展示格式有区别:Node.js输出Buffer时会自动给字节的十六进制表示加空格分隔,PHP的bin2hex输出的是连续无分隔的十六进制字符,这不是导致Base64结果错误的原因。
解决方案
直接对原始字符串做Base64编码即可复现Node.js的运行结果,完整复现代码如下:
<?php $name = "Bobs Basement Records"; // 复现Node.js的<Buffer ...>格式输出 $hex = bin2hex($name); echo '<Buffer ' . implode(' ', str_split($hex, 2)) . '>' . PHP_EOL; // 复现原始字符串输出 echo $name . PHP_EOL; // 复现base64编码结果,直接编码原始字符串即可 echo base64_encode($name) . PHP_EOL; ?>
上述代码运行后输出结果与你提供的Node.js运行结果完全一致。
内容的提问来源于stack exchange,提问作者Eng.Wagdi
相关产品推荐
相关产品推荐

