在 PHP 中解压十六进制编码的二进制数据
Unpack hex-encoded binary data in PHP
我们正在从合作伙伴的 IoT 设备收集数据,数据以十六进制字符串编码,例如 1C000000010028
,其中包含二进制数据:
- 字节 0 位 0 布尔值
- 字节 0 位 1 布尔值
- 字节 0 位 2 布尔值
- 字节 0 位 3 布尔值
- 字节 0 位 4-7 UInt4
- 字节 1-2 位 0-15 UInt16
- 字节 3 位 0-7 UInt8
- 字节 4-5 位 0-15 UInt16
- 字节 6 位 0-7 UInt8
我从来没有处理过这种数据,想知道如何在 PHP 中解码/解压它。我猜 https://www.php.net/manual/de/function.unpack.php 会是我的朋友,但我就是不明白。任何帮助将不胜感激,谢谢!
他们说输入是一个十六进制字符串,如“1C000000010028”。
$code = '1C000000010028';
要使用 unpack(),数据必须是带有二进制数据的字符串。你可以用hex2bin转换它。
$binaryData = hex2bin($code);
// "\x1c\x00\x00\x00\x01\x00\x28"
现在你可以使用 unpack 了。
$arr = unpack('Cbyte_0/vUInt16_0/Cbyte_1/vUInt16_1/Cbyte_2',$binaryData);
/*
$arr = array (
'byte_0' => 28,
'UInt16_0' => 0,
'byte_1' => 0,
'UInt16_1' => 1,
'byte_2' => 40,
)
*/
Boolean 和 UInt4 等个别数据类型不包含在 pack/unpack 格式中。要获取此数据,您必须使用 bit operators.
举个例子:
$byte_0bit2 = (bool)($arr['byte_0'] & 0b00000100);
这可能会引发更多问题,您可以在 Whosebug 上找到答案。
我们正在从合作伙伴的 IoT 设备收集数据,数据以十六进制字符串编码,例如 1C000000010028
,其中包含二进制数据:
- 字节 0 位 0 布尔值
- 字节 0 位 1 布尔值
- 字节 0 位 2 布尔值
- 字节 0 位 3 布尔值
- 字节 0 位 4-7 UInt4
- 字节 1-2 位 0-15 UInt16
- 字节 3 位 0-7 UInt8
- 字节 4-5 位 0-15 UInt16
- 字节 6 位 0-7 UInt8
我从来没有处理过这种数据,想知道如何在 PHP 中解码/解压它。我猜 https://www.php.net/manual/de/function.unpack.php 会是我的朋友,但我就是不明白。任何帮助将不胜感激,谢谢!
他们说输入是一个十六进制字符串,如“1C000000010028”。
$code = '1C000000010028';
要使用 unpack(),数据必须是带有二进制数据的字符串。你可以用hex2bin转换它。
$binaryData = hex2bin($code);
// "\x1c\x00\x00\x00\x01\x00\x28"
现在你可以使用 unpack 了。
$arr = unpack('Cbyte_0/vUInt16_0/Cbyte_1/vUInt16_1/Cbyte_2',$binaryData);
/*
$arr = array (
'byte_0' => 28,
'UInt16_0' => 0,
'byte_1' => 0,
'UInt16_1' => 1,
'byte_2' => 40,
)
*/
Boolean 和 UInt4 等个别数据类型不包含在 pack/unpack 格式中。要获取此数据,您必须使用 bit operators.
举个例子:
$byte_0bit2 = (bool)($arr['byte_0'] & 0b00000100);
这可能会引发更多问题,您可以在 Whosebug 上找到答案。