2017-10-04 132 views
3

我沒有使用過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

回答

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

那麼最後一個問題是因爲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,很高興幫助 –

相關問題