Ruby Digest :: MD5.base64digest和PHP base64_encode

时间:2017-10-04 07:54:15

标签: 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(', ', $bytes));
echo base64_encode(md5($pack)); // YzRjYTQyMzhhMGI5MjM4MjBkY2M1MDlhNmY3NTg0OWI=

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

1 个答案:

答案 0 :(得分:1)

在解压缩然后重新打包字节时,不需要它,但不能保持代码原样。

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

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

或者在PHP&gt; 5.6你可以使用内联参数解包。 ...

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

然后最后一个问题是因为rubys base64digest维护了摘要状态,你还需要使用md5的第二个参数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==