2012-07-30 134 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.