在 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的主要内容,如果未能解决你的问题,请参考以下文章

Php与Erlang的Socket通信

多个输出和 numba 签名

转换缓冲区表示 int little endian Python 类的列表

PInvoke - 方法的类型签名与 PInvoke 不兼容

如何检查 APK 是不是已签名或“调试构建”?

IntelliJ:搜索已检查的异常,在方法签名中声明,但从未在正文中抛出 [关闭]