我正在尝试将二进制字符串转换为特定格式的字节数组。
示例二进制数据:
ê≤Ú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教程的链接。
答案 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);