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

问题描述:

我没有使用过Ruby,只能使用php。我需要帮助。Ruby Digest :: MD5.base64digest和PHP之间的不同结果base64_encode

我有红宝石代码编码字符串这样的:

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= 

为什么结果不一样。感谢帮助。

+0

您是否看到我的答案?希望它有帮助。 –

+0

是的,这是帮助!谢谢。 – alexandernoa

作为它的解包,然后重新打包不需要的字节,但没有保持代码原样。

在PHP pack要求每个数组参数都要传递,所以你需要重新打包一个循环中的每个参数。

<?php 
$str = 123; 
$bytes = unpack('C*', $str); 
$pack = null; 
foreach ($bytes as $arg) $pack .= pack('C*', $arg); 

或者在PHP> 5.6中,您可以使用内联参数解包。 ...

$str = 123; 
$bytes = unpack('C*', $str); 
$pack = pack('C*', ...$bytes); 

那么最后一个问题是因为RUBYS base64digest维持消化状态,你还需要使用MD5的第二PARAM raw_output做同样的。

如果可选raw_output设置为TRUE,那么MD5摘要 而是返回原始的二进制格式以16

$str = 123; 
echo base64_encode(md5($str, true)); 

长度所以你完成移植的代码看起来像:

$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== 
+0

对不起,对于迟到的答案,我试着你的代码,它工作得很好!万分感谢!!! – alexandernoa

+0

np,很高兴帮助 –