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

标签 php python binary

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

示例二进制数据:

ê≤Ú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/

相关文章:

python - Geopandas - 在与多边形相交处分割线,在新链接属性中保留多边形 ID

c - 用C语言读写多行数据文件

java - 我可以执行 Java 类文件的多个实例吗?

php - 如何从 PHP 代码中调用 MySQL 存储过程?

php - 如何将字符串转换为数组名称 (php)?

python - 逻辑回归和 numpy : ValueError: operands could not be broadcast together with shapes

将存储在 2 个无符号字符中的二进制转换为整数

php - 在 Yii2 中创建带有链接的按钮

PHP Content-Type 不显示条码图像

python - 将递归函数变成迭代函数