在 PHP 中解压已签名的 int32 little-endian
Posted
技术标签:
【中文标题】在 PHP 中解压已签名的 int32 little-endian【英文标题】:Unpack signed int32 little-endian in PHP 【发布时间】:2017-07-18 15:51:12 【问题描述】:我有一个要解析的二进制文件。文件的一小部分有一组坐标(纬度和经度)。一个小例子如下:
$data = "64DA7300 0CD5DFFF";
我正在尝试查看整数,但我还没有运气。
$header = unpack("ilatitud/ilongitude", $data);
print_r($header);
我知道正确的数字应该是:(7592548, -2108148)
,但结果是1094988854, 808465207
。
有什么想法吗?谢谢。
【问题讨论】:
是ADS-B坐标吗?如果我没记错的话,他们需要的不仅仅是普通的十六进制 -> 二进制转换 它们只是GPS坐标,结果需要除以65536才能得到准确的坐标。但是,我的问题是转换.. :/$data = "64DA7300 0CD5DFFF";
那不是二进制文件。
@tkausl 是的...你的意思是?如果您参考我对二进制的评论,您可以了解 ADS-B GPS 的工作原理。这是飞机发送到地面的东西,告诉他们他们在哪里。使飞行雷达工作的东西。由于全尺寸 GPS 信号对于飞机来说太大了,他们将其压缩为十六进制 -> 二进制 -> 十进制以获取坐标。
我的意思是,您正试图从包含 ascii-hex 形式的 int 的字符串中解压缩二进制 little-endian int。
【参考方案1】:
$data = "64DA7300 0CD5DFFF";
您的数据不是二进制的,而是十六进制编码的 ascii。先把它变成二进制:
$data = hex2bin(str_replace(" ", "", $data));
然后你的解包就可以了。
Example
【讨论】:
以上是关于在 PHP 中解压已签名的 int32 little-endian的主要内容,如果未能解决你的问题,请参考以下文章
转换缓冲区表示 int little endian Python 类的列表