Ruby Digest::MD5.base64digest和PHP base64_encode之间的不同结果

Ruby Digest::MD5.base64digest和PHP base64_encode之间的不同结果,php,ruby,encoding,base64,Php,Ruby,Encoding,Base64,我从来没有使用过ruby,只使用过php。我需要帮助 我有ruby代码,它对字符串进行如下编码: str = '123'; arr = str.bytes p Digest::MD5.base64digest(arr.pack('C*')) # ICy5YqxZB1uWSwcVLSNLcA== 我需要在php中执行同样的操作,并得到相同的结果。我的例子 $str = '123'; $bytes = unpack('C*', $str); $pack = pack('C*', implode('

我从来没有使用过ruby,只使用过php。我需要帮助

我有ruby代码,它对字符串进行如下编码:

str = '123';
arr = str.bytes
p Digest::MD5.base64digest(arr.pack('C*')) # ICy5YqxZB1uWSwcVLSNLcA==
我需要在php中执行同样的操作,并得到相同的结果。我的例子

$str = '123';
$bytes = unpack('C*', $str);
$pack = pack('C*', implode(', ', $bytes));
echo base64_encode(md5($pack)); // YzRjYTQyMzhhMGI5MjM4MjBkY2M1MDlhNmY3NTg0OWI=

为什么结果不同。谢谢你的帮助。

因为它先解包,然后再重新打包不需要的字节,但我会保持代码原样

在PHP中,需要传递每个数组参数,因此需要在循环中重新打包每个参数

<?php
$str = 123;
$bytes = unpack('C*', $str);
$pack = null;
foreach ($bytes as $arg) $pack .= pack('C*', $arg);
最后一个问题是因为rubys维护摘要状态,所以还需要使用md5的第二个参数来执行相同的操作

如果可选的raw_输出设置为TRUE,则md5摘要将被删除 而是以原始二进制格式返回,长度为16

因此,您完成的移植代码如下所示:

$str = 123;
$bytes = unpack('C*', $str);
$pack = pack('C*', ...$bytes);
echo base64_encode(md5($pack, true)); // ICy5YqxZB1uWSwcVLSNLcA==
或者只是

<?php
$str = 123;
echo base64_encode(md5($str, true)); // ICy5YqxZB1uWSwcVLSNLcA==

你看到我的答案了吗?希望有帮助。是的,有帮助!谢谢。很抱歉回答晚了,我正在尝试你的代码,它工作得很好!非常感谢你!!!我很乐意帮忙
$str = 123;
$bytes = unpack('C*', $str);
$pack = pack('C*', ...$bytes);
echo base64_encode(md5($pack, true)); // ICy5YqxZB1uWSwcVLSNLcA==
<?php
$str = 123;
echo base64_encode(md5($str, true)); // ICy5YqxZB1uWSwcVLSNLcA==