首页 > 解决方案 > 将一对十六进制编码的浮点数解码为本机浮点值

问题描述

我有一个设备将其纬度和经度作为浮点数 (lat+lng) 发送到 Sigfox:
消息开头为 -6.60276853.37419

在设备上,由于 12 字节的消息长度限制,我必须使用 micropython 打包浮点数:

message=struct.pack('f',float(lat)) +struct.pack('f',float(lng))) 
message.send

一旦它到达 Sigfox,回调将它作为十六进制消息发送到我的服务器:

data=e049d3c02b7f5542

而且我无法解压缩 php 中的原始浮点数:

<?php
$_data = $_GET["data"];
$rcvMsgHexString = $_data;  
print("Received message = ".$rcvMsgHexString." [".strlen($$rcvMsgHexString)." characters]\n");

// Convert hex string back to binary string
$rcvMsgString = '';
for ($i=0; $i<8; $i++) {
  $byte = substr($rcvMsgHexString,2*$i,2);
  $rcvMsgString[$i] = chr(hexdec($byte));
}
print $rcvMsgString;

// Make sure to unpack in correct order: lat is at start of string
$lat = unpack( "f", $rcvMsgString, 0 );
$lng = unpack( "f", $rcvMsgString, 4 );

if ( $fl = fopen('logs.txt','a')) {
  fwrite($fl,"\"msg\": { \"latitude\" : \"". $lat. "\", "
                       ."\"longitude\" :\"" . $lng . "\" }\n" );
  fclose($fl);
 }
?>

lat 和 lng 只是写为空白。谁能帮我正确检索原始的经纬度和经度吗?

标签: php

解决方案


用于pack将十六进制数字转换为实际的二进制数据,然后unpack从二进制中提取浮点值:

$coords = unpack('flat/flon', pack('H*', $data));
echo $coords['lat'] . PHP_EOL;
echo $coords['lon'] . PHP_EOL;

细节:

  • pack('H*', ...)从 读取十六进制数字$data,将它们转换为二进制编码数据。
  • unpack('flat/flon', ...)从二进制字符串中读取一个浮点数,将其存储在 key 下的结果数组中lat,然后从二进制字符串中读取另一个浮点数并将其存储在 下的结果数组中lon

观看 3v4l 直播。


推荐阅读