我没有使用过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=
为什么结果不同。谢谢你的帮助。
答案 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==