4

我正在通过 udp 数据包从 gps 单元接收数据。Lat/Lng 值以十六进制表示。

示例数据
13BF71A8 = 纬度 (33.1313576)
BA18A506 = 经度 (-117.2790010)

该文档解释说,经度/纬度读数以度为单位测量,1x10^-7 度 lsb,带符号 2 的补码。

对于纬度,我可以使用以下公式进行转换:
13BF71A8 = 331313576 * 0.0000001 = 33.1313576

此代码适用于 Lat 但不适用于 Lng:

function convertLat(h){
var latdec = parseInt(h,16);
    var lat = latdec * 0.0000001;
    return lat;
}

console.log("LAT: " + convertLat("13BF71A8"));

我在转换经度值时遇到问题。有谁知道如何转换经度?

4

3 回答 3

5

因为您使用的是带符号的数字,所以您需要指定十六进制代码应该翻转到底部的点。这将发生在7FFFFFFF及以上。现在更新您的代码以检查输入是否大于此数字,如果是,则从输入中减去它。

function convert(h) {
    dec = parseInt(h, 16);
    return (dec < parseInt('7FFFFFFF', 16)) ?
        dec * 0.0000001 :
        0 - ((parseInt('FFFFFFFF', 16) - dec) * 0.0000001);
}

您的示例有效的唯一原因是预期输出为正。


正如AlexWien在评论中提到的:由于每次解析7FFFFFFFFFFFFFFF给出相同的整数,您可以将它们存储为常量。它们的值分别是21474836474294967295

于 2013-10-16T16:34:47.950 回答
1

Lat 和 Long 使用相同的算法进行转换。你的纬度意外地工作了,因为它是积极的(33.13)

测试经度是负数,这使得转换算法中的错误可见,就像通常使用负数一样。

于 2013-10-16T16:31:22.857 回答
0

用这个来赞美 2

private static Decimal ParseHexStringToDouble(string hexNumber) {
    long result = 0;
    result = int.Parse(hexNumber, System.Globalization.NumberStyles.HexNumber);
    return result;
}
于 2014-12-29T07:49:48.077 回答