使用unpack()转换为PHP中的字节数组

时间:2014-06-09 10:24:17

标签: php python binary

我正在尝试将二进制字符串转换为特定格式的字节数组。

示例二进制数据:

ê≤ÚEZêK

二进制字符串的十六进制版本如下所示:

00151b000000000190b2f20304455a000003900000004b0000

Python脚本使用struct包并使用以下代码解压缩上面的字符串(二进制):

data = unpack(">hBiiiiih",binarydata)

所需的字节数组如下所示。这也是data数组的输出:

(21, 27, 0, 26260210, 50611546, 912, 75, 0)

如何使用PHP的unpack()函数解压缩相同的二进制字符串并获得相同的输出?也就是说,PHP中的>hBiiiiih等价物是什么?

到目前为止我的PHP代码

$hex = "00151b000000000190b2f20304455a000003900000004b0000";
$bin = pack("H*",$hex);
print_r(unpack("x/c*"));

给出了:

Array ( [*1] => 21 [*2] => 27 [*3] => 0 [*4] => 0 [*5] => 0 [*6] => 0 [*7] => 1 [*8] => -112 [*9] => -78 [*10] => -14 [*11] => 3 [*12] => 4 [*13] => 69 [*14] => 90 [*15] => 0 [*16] => 0 [*17] => 3 [*18] => -112 [*19] => 0 [*20] => 0 [*21] => 0 [*22] => 75 [*23] => 0 [*24] => 0 )

还希望获得有关使用pack / unpack的PHP教程的链接。

1 个答案:

答案 0 :(得分:2)

这会产生与Python相同的结果,但它会将签名值视为无符号值,因为unpack()没有带有字节顺序的带符号值的格式代码。另请注意,整数使用long转换,但这没关系,因为它们都具有相同的大小。

$hex = "00151b000000000190b2f20304455a000003900000004b0000";
$bin = pack("H*", $hex);
$x = unpack("nbe_unsigned_1/Cunsigned_char/N5be_unsigned_long/nbe_unsigned_2", $bin);

print_r($x);
Array
(
    [be_unsigned_1] => 21
    [unsigned_char] => 27
    [be_unsigned_long1] => 0
    [be_unsigned_long2] => 26260210
    [be_unsigned_long3] => 50611546
    [be_unsigned_long4] => 912
    [be_unsigned_long5] => 75
    [be_unsigned_2] => 0
)

由于此数据被视为无符号,因此您需要检测原始数据是否为负数,这可以通过类似于此的2字节短路来完成:

if $x["be_unsigned_1"] >= pow(2, 15)
    $x["be_unsigned_1"] = $x["be_unsigned_1"] - pow(2, 16);

和长期使用

if $x["be_unsigned_long2"] >= pow(2, 31)
    $x["be_unsigned_long2"] = $x["be_unsigned_long2"] - pow(2, 32);