2012-07-30 100 views
0

我正在翻譯一個應用程序從Java到PHP,我發現一些麻煩。十六進制從爪哇到PHP

我有這樣98191107990D0000EF050000789C65970BCCD75318C7CFEFFC串...在Java中有這個功能,我通過這個字符串作爲參數:

private static byte[] decodeNibbleHex(String input) 
    { 
    ByteArrayOutputStream baos = new ByteArrayOutputStream(); 
    char[] chars = input.toCharArray(); 
    for (int i = 0; i < chars.length - 1; i += 2) { 
     char[] bChars = new char[2]; 
     bChars[0] = chars[i]; 
     bChars[1] = chars[(i + 1)]; 
     int val = Integer.decode("0x" + new String(bChars)).intValue(); 
     baos.write((byte)val); 
    } 
    return baos.toByteArray(); 
    } 

但是...我不知道翻譯在PHP這個功能...我嘗試了太多次,我變得瘋了!我嘗試了一個for循環,與此eval("\$hex = 0x" . $dati[$i].$dati[$i+1] . ";");和此$binary_string = pack("h*" , $dati[$i].$dati[$i+1]);和許多其他許多功能...

如果有人瞭解Java並可以幫助我,我會感激它!

謝謝你們!

+0

我們能看到你的嘗試嗎?也許它非常接近,需要小小的調整。 – vcsjones 2012-07-30 17:56:22

+0

預期產量是多少? – 2012-07-30 18:09:05

回答

0

如果我的理解對你的java函數是正確的,它會將字符串的字符配對,並將它們威脅爲字節並將它們放入ByteArray中。在PHP中,沒有像字節數組這樣的東西,但是你可以在日常字符串中表示隨機二進制數據。這是我對你的函數的承擔(沒有試圖與java代碼的輸出進行比較)。

$str= '98191107990D0000EF050000789C65970BCCD75318C7CFEFFC'; 

$output[] = array(); 
for ($i=0, $c = strlen($str) - 1; $i < $c; $i+=2) { 
    $output[] = chr(intval($str[$i].$str[$i+1], 16)); 
} 

print join($output); // binary string, not really useful in ascii terminal (-: 

總之這似乎是一個base16_decode()功能,具有base16_encode()這樣寫它遵循,你回來的輸入字符串:

function base16_encode($str) { 
    $byteArray = str_split($str); 
    foreach ($byteArray as &$byte) { 
     $byte = sprintf('%02x', ord($byte)); 
    } 
    return join($byteArray); 
} 
print base16_encode(join($output)); // should print back the original input.