将十六进制编码的浮点数解码为本地浮点值

时间:2019-02-13 14:06:13

标签: php

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

在设备上,由于消息长度限制为12字节,我必须在float中加上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仅写为空白。有人可以帮我正确地找到原始经纬度吗?

1 个答案:

答案 0 :(得分:1)

使用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', ...)从二进制字符串读取一个浮点数,将其存储在键lat下的结果数组中,然后从二进制字符串读取另一个浮点并将其存储在{{1}下的结果数组中}。

See it live on 3v4l.