在PHP中解压十六进制编码的二进制数据

在PHP中解压十六进制编码的二进制数据,php,binary,hex,iot,Php,Binary,Hex,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解码/解包这些数据。我猜那会是我的朋友,但我就是不明白。任何帮助都将不胜感激,谢谢 他们说

我们正在从合作伙伴的物联网设备收集数据,数据以十六进制字符串编码,如
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解码/解包这些数据。我猜那会是我的朋友,但我就是不明白。任何帮助都将不胜感激,谢谢

他们说输入是一个十六进制字符串,如“1C000000010028”

$code = '1C000000010028';
要使用unpack(),数据必须是包含binaryData的字符串。你可以用hex2bin转换它

$binaryData = hex2bin($code);
// "\x1c\x00\x00\x00\x01\x00\x28"
现在你可以用解包了

$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,
)
*/
打包/解包格式中不包括单独的数据类型,如布尔值和UInt4。要获得这些数据,您必须使用

仅举一个例子:

$byte_0bit2 = (bool)($arr['byte_0'] & 0b00000100);

这可能导致进一步的问题,其答案可以在Stackoverflow上找到。

他们说输入是一个十六进制字符串,如“1C000000010028”

$code = '1C000000010028';
要使用unpack(),数据必须是包含binaryData的字符串。你可以用hex2bin转换它

$binaryData = hex2bin($code);
// "\x1c\x00\x00\x00\x01\x00\x28"
现在你可以用解包了

$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,
)
*/
打包/解包格式中不包括单独的数据类型,如布尔值和UInt4。要获得这些数据,您必须使用

仅举一个例子:

$byte_0bit2 = (bool)($arr['byte_0'] & 0b00000100);

这可能导致进一步的问题,其答案可在Stackoverflow上找到。

附加信息:索引:字节按大端顺序排列,位按标准76543210“小端”顺序排列。附加信息:索引:字节按大端顺序排列,位按标准76543210“小端”顺序排列订购。感谢@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))等等…为什么不呢?通往罗马的路有很多……谢谢你的灵感@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))等等…为什么不呢?通往罗马的路很多。。