php - 将一对十六进制编码的浮点数解码为本机浮点值
问题描述
我有一个设备将其纬度和经度作为浮点数 (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 只是写为空白。谁能帮我正确检索原始的经纬度和经度吗?
解决方案
用于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
。
推荐阅读
- sbt - sbt.ResolveException:未解决的依赖项:org.apache.spark#spark-core_2.11;2.1.2:未找到
- angular - http调用失败时如何通知转储组件?
- docker - gitlab 构建图像生成器
- android - 重命名变量以使 XML id 更清晰
- ios - 更改项目位置xcode 9.2时如何解决swift编译器错误?
- pycharm - 为什么我无法导入 google-cloud-speech?
- ios - iOS 中的 Facebook 登录 SDK 语言问题
- javascript - 对位于另一个单独范围内的范围进行求和的算法
- python - 需要在 Python 中转换有效日期值并错误输出无效值
- javascript - 对象作为 React 子级无效(找到:[object HTMLDivElement])