我正在将一个应用程序从java翻译成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 :(得分:0)
答案 1 :(得分: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.