gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-01 05:11:35 24 4
gpt4 key购买 nike

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

示例二进制数据:

ê≤ÚEZêK

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

00151b000000000190b2f20304455a000003900000004b0000

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

data = unpack(">hBiiiiih",binarydata)

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

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

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

到目前为止我的 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 教程的链接。

最佳答案

这会产生与 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);

关于php - PHP 中使用 unpack() 转换为字节数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24118239/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com