在 PHP 中解压十六进制编码的二进制数据
Posted
技术标签:
【中文标题】在 PHP 中解压十六进制编码的二进制数据【英文标题】:Unpack hex-encoded binary data in PHP 【发布时间】:2021-06-11 13:49:45 【问题描述】:我们正在从合作伙伴的物联网设备收集数据,数据以十六进制字符串编码,例如 1C000000010028
,其中包含二进制数据:
我从来没有使用过这种数据,我想知道如何在 php 中解码/解包。我猜https://www.php.net/manual/de/function.unpack.php 会是我的朋友,但我就是不明白。任何帮助将不胜感激,谢谢!
【问题讨论】:
附加信息:索引:字节按大端顺序排列,位按标准 76543210“小端”顺序排列。 【参考方案1】:他们说输入是一个十六进制字符串,例如“1C000000010028”。
$code = '1C000000010028';
要使用 unpack(),数据必须是带有 binaryData 的字符串。您可以使用 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 等单独的数据类型不包含在打包/解包格式中。要获取此数据,您必须使用 bit operators。
这只是一个例子:
$byte_0bit2 = (bool)($arr['byte_0'] & 0b00000100);
这可能会导致更多问题,可以在 *** 上找到答案。
【讨论】:
感谢@jspit 的启发!我还在手册中找到了一个脚注:“索引:字节采用大端顺序,位采用标准 76543210“小端”顺序。”让它更有趣......我目前的解决方案有点奇怪,但有效:str_split(str_pad(base_convert($message, 16, 2), 56, '0', STR_PAD_LEFT), 8);
然后像$part[0] = (bool)$bytes[0][7];
$part[4] = bindec(substr($bytes[0], 0, 4));
等......以上是关于在 PHP 中解压十六进制编码的二进制数据的主要内容,如果未能解决你的问题,请参考以下文章