将十六进制转换为lat&;所需的PHP函数;长的

将十六进制转换为lat&;所需的PHP函数;长的,php,binary,hex,coordinates,Php,Binary,Hex,Coordinates,我有一个关于格度和经度编码的问题,我的大脑拒绝回答这个问题 我需要编写一个php函数,该函数接受值“1446041F”和“447D1100”(Lat和Lng)进行一些处理(我无法理解的位),并输出“52.062297”和“0.191030” 我被告知Lat和Lng从有符号的度、分钟和十进制分钟编码为4字节,格式如下 Latitude: SDDMM.MMMMM where 0≤DD≤90, S = [+|-], 0≤M≤9 Longitude: SDDDMM.MMMMM where 0≤DDD≤1

我有一个关于格度和经度编码的问题,我的大脑拒绝回答这个问题

我需要编写一个php函数,该函数接受值“1446041F”和“447D1100”(Lat和Lng)进行一些处理(我无法理解的位),并输出“52.062297”和“0.191030”

我被告知Lat和Lng从有符号的度、分钟和十进制分钟编码为4字节,格式如下

Latitude: SDDMM.MMMMM where 0≤DD≤90, S = [+|-], 0≤M≤9
Longitude: SDDDMM.MMMMM where 0≤DDD≤180, S = [+|-], 0≤M≤9
最后一点,我搜索了很多网站,但我仍然不知道这意味着什么

我知道这是一个巨大的黑暗中拍摄,它可能是如此简单,我有理由坐在角落里戴着愚蠢的帽子,但我的头发少拉

任何建议都将不胜感激

谢谢,
Matthew

您给出的示例,
1446041F
447D1100
可能是以小尾端字节顺序排列的32位有符号整数。 其内容如下:

1446041F -> 0x1F044614 -> 520373780
447D1100 -> 0x00117D44 -> 001146180
它们可以用度和分来解释,如下所示:

520373780 -> 52 degrees, 03.73780 minutes
1146480 -> 0 degrees, 11.46480 minutes
以下函数将您指定的十六进制值转换为度。我假设这些值是0x447D1100之类的整数。如果我假设错误,并且输入值实际上是字符串,请告诉我。我把这个功能放到了公共领域

function hextolatlon($hex){
  // Assume hex is a value like 0x1446041F or 0x447D1100
  // Convert to a signed integer
  $h=$hex&0xFF;
  $h=($h<<8)|(($hex>>8)&0xFF);
  $h=($h<<8)|(($hex>>16)&0xFF);
  $h=($h<<8)|(($hex>>24)&0xFF);
  $negative=($h>>31)!=0; // Get the sign
  if($negative){
   $h=~$h;
   $h=$h&0x7FFFFFFF;
   $h++;
  }
  // Convert to degrees and minutes
  $degrees=floor($h/10000000);
  $minutes=$h%10000000;
  // Convert to full degrees
  $degrees+=($minutes/100000.0) / 60.0;
  if($negative)$degrees=-$degrees;
  return $degrees;
}
函数hextolatlon($hex){ //假设十六进制是类似于0x1446041F或0x447D1100的值 //转换为有符号整数 $h=$hex&0xFF; $h=($h8)和0xFF); $h=($h16)和0xFF); $h=($h24)和0xFF); $negative=($h>>31)!=0;//获取符号 如果($负){ $h=~$h; $h=$h&0x7FFFFFFF; $h++; } //转换成度和分 $degrees=地板($h/10000000); $minutes=$h%10000000; //转换为全学位 $degrees+=($minutes/100000.0)/60.0; 如果($负)$度=-$度; 返回$degrees; } 以下是PHP(为了清晰起见,请详细说明):


至少你不会一个人呆在那个角落里,很酷。不管怎样,我给了你+1分,因为你先提到了小endian的事情。我原以为是这样的,但当我看到你的帖子时,我仍在查看。谢谢你的精彩回答,彼得O,但道格的功能做得很好。我还有几个谜团要解决,我会用这个代码例子给其他人打下基础。感谢您抽出时间-我喜欢Stack Overflow社区!顺便说一句,道格;如果你有贝宝账户,请告诉我,我会给你寄一些啤酒钱:)
function llconv($hex) {
    // Pack hex string:
    $bin = pack('H*', $hex);

    // Unpack into integer (returns array):
    $unpacked = unpack('V', $bin);

    // Get first (and only) element:
    $int = array_shift($unpacked);

    // Decimalize minutes:
    $degmin = $int / 100000;

    // Get degrees:
    $deg = (int)($degmin/100);

    // Get minutes:
    $min = $degmin - $deg*100;

    // Return degress:
    return round($deg + ($min/60), 6);
}

$long = '1446041F';
$lat = '447D1100';

$iLong = llconv($long);
$iLat = llconv($lat);

print "Out: $iLong x $iLat\n";