【问题标题】:php unpack() with H* or bin2hex() stripping of leading zeros使用 H* 或 bin2hex() 去除前导零的 php unpack()
【发布时间】:2015-01-27 08:51:21
【问题描述】:

我有一些前导零字节的二进制数据,但是当我解压这些数据并将其转储为十六进制字符串时,我似乎丢失了这些字节。我做错了什么?

更多详情...

我正在 php 中集成 GPS 设备数据。

进入设备的数据是二进制格式,我正在使用

$arr = unpack("H*", $input);

我得到的数据是

01aa08080000014b27163dfc00328e2c950d3edc0a00c2010b0f000e00080301010200f00103091f4542374318000e01c700000004014e00000000000000000000014b271645cc00328e29110d3edc4e00c301160f001000080301010200f001030920814236e818001001c700000008014e00000000000000000000014b2716518400328e24e10d3edc8700c301040e000800080301010200f00103091f8242371518000801c70000000d014e00000000000000000000014b2716a40400328e21510d3edd5c00c6013a0e000800080301010200f00103091f3d4236bc18000801c700000001014e00000000000000000000014b2717dd5600328e1e060d3edd1300cd01080d0000fa090401000200f000fa000309000e4232e718000001c700000000014e00000000000000000000014b2719b86000328e1e060d3edd1300d001080d000000050301000200f0000209001142328b00000000014b271b8fb400328e1e060d3edd1300d001080d000000050301000200f0000209001142327200000000014b271d69b000328e1e060d3edd1300d001080d000000050301000200f0000209001142325e0000080000a771

or 

2d08010000014b275faaa000328e1e060d3edd1300d001080d000000050301000200f000020900124231e400000100002144

这是一种错误的数据格式,因为前导零都被删除了。 根据集成文档,数据将以

开头
Four zero bytes (0x00)

4B AVL Data Length in the format 0000xxxx

前2个数据的正确格式应该是

00000000000001aa08080000014b27163dfc00328e2c950d3edc0a00c2010b0f000e00080301010200f00103091f4542374318000e01c700000004014e00000000000000000000014b271645cc00328e29110d3edc4e00c301160f001000080301010200f001030920814236e818001001c700000008014e00000000000000000000014b2716518400328e24e10d3edc8700c301040e000800080301010200f00103091f8242371518000801c70000000d014e00000000000000000000014b2716a40400328e21510d3edd5c00c6013a0e000800080301010200f00103091f3d4236bc18000801c700000001014e00000000000000000000014b2717dd5600328e1e060d3edd1300cd01080d0000fa090401000200f000fa000309000e4232e718000001c700000000014e00000000000000000000014b2719b86000328e1e060d3edd1300d001080d000000050301000200f0000209001142328b00000000014b271b8fb400328e1e060d3edd1300d001080d000000050301000200f0000209001142327200000000014b271d69b000328e1e060d3edd1300d001080d000000050301000200f0000209001142325e0000080000a771

and 

000000000000002d08010000014b275faaa000328e1e060d3edd1300d001080d000000050301000200f000020900124231e400000100002144

注意 4B 前导零和 4B 数据长度,用零填充。

当我使用时

$arr = bin2hex($value)

它给了我同样的结果。

但我确信数据在二进制文件中,我无法呈现前导零。

请帮忙。

提前致谢

【问题讨论】:

  • 你的问题是什么?
  • 你能说明你是如何转储结果的吗?您正在解包,然后只是 echo bin2hex($binaryData); ?
  • 我无法用 hex2bin('0000000012345678') 之类的测试数据重现这一点,所以我怀疑收集二进制数据的东西可能出了什么问题?
  • 另外,unpack 或 bin2hex 不会剥离任何数据:3v4l.org/9iLUm

标签: php unpack


【解决方案1】:

在查看代码时注意到我正在处理二进制数据。

$input = trim($input);

造成了问题。

注释了代码,解包返回所需的确切格式

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-04-20
    • 1970-01-01
    • 2012-07-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多