2017-10-04 11 views
3

私はRubyではこれまでにはPHPでしか動作しませんでした。そして私は助けが必要です。Ruby Digest :: MD5.base64digestとPHP base64_encodeの結果が異なる

私はエンコードそのような文字列ルビーコード持っている:私はPHPで同じことを行うと、同じ結果を取得する必要があります

str = '123'; 
arr = str.bytes 
p Digest::MD5.base64digest(arr.pack('C*')) # ICy5YqxZB1uWSwcVLSNLcA== 

を。私の例

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

なぜ結果が違うのですか?手伝ってくれてありがとう。

+0

あなたは私の答えを見ましたか?うまくいけば、それは役に立ちます。 –

+0

ええ、それは助けになります!ありがとう。 – alexandernoa

答えて

1

バイトをアンパックして再パックするとき、バイトは必要ではありませんが、コードをそのまま保ちます。

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); 

ルビーズ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、喜んで助けてください –