【问题标题】:Convert IEEE 754 to decimal floating point将 IEEE 754 转换为十进制浮点数
【发布时间】:2016-04-02 13:38:35
【问题描述】:

我有我认为是单精度或双精度的 IEEE754(不确定),我想在 PHP 上将其转换为十进制。

给定 4 个十六进制值(可能是小端格式,所以基本上是颠倒的顺序)4A,5B,1B,05 我需要将其转换为十进制值,我知道它会非常接近4724.50073

我尝试了一些在线转换器,但它们与预期的结果相去甚远,所以我显然遗漏了一些东西。

如果我echo 0x4A; 我得到74 而其他人是91275。不知道从哪里拿它...

【问题讨论】:

  • 您拥有的确切数据是什么?
  • @cmorrissey 它们应该是 GPS 坐标,文档中的描述说 All floating point values are transmitted in IEEE754 single or double precision 然后我得到这些确切的值 4A,5B,1B,05 我知道它是 4724.50073,只是不知道如何到达那里。
  • 你确定你给出的十六进制值和十进制值的对应关系吗?我看到在 4724.50073 的二进制表示中,有三个连续的 1 数字,无论你是否在点后面取小数。并且无论您如何排序,十六进制数字中都没有这样的二进制数字序列。
  • 您能否向我们提供您正在处理的邮件的具体文档?
  • 如果它是小端,我不得不想知道为什么指数这么小。如果它是大端,快速访问binaryconvert.com/convert_float.html 会发现它不是您所期望的。此外,由于这些是坐标,您可能会认为它们具有不同的表示形式(例如 dº m's")

标签: php hex decimal ieee-754


【解决方案1】:

要将其转换为浮点数,请使用unpack。如果字节顺序不正确,您必须在解包之前自己反转它。 4 字节(32 位)通常表示它是一个浮点数,8 表示双精度。

$bin = "\x4A\x5B\x1B\x05";
$a = unpack('f', strrev($bin));
echo $a[1];  // 3589825.25

我看不出这如何直接映射到4724.50073。如果没有更多的测试数据或制造商手册,这个问题无法完全回答。

推测:从坐标的大小来看,它可能是某种投影(XYZ 或墨卡托),然后可以转换为 WGS84 或您需要的任何东西。不幸的是,由于您没有提供纬度和经度,因此无法检查。

【讨论】:

    猜你喜欢
    • 2014-06-18
    • 1970-01-01
    • 2011-02-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-09-18
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多