我正在编写C#代码来编程GPS跟踪器(Sinowell G102)上的地理围栏。地理围栏是矩形的。我基本上必须采用左上角坐标和右下角坐标,并将其编程到跟踪器中。现在,跟踪器期望这些坐标采用BCD格式(二进制编码的十进制)。每个坐标长4个字节。现在,我想出了如何将正经度或经度坐标转换为BCD - 根据跟踪器的协议手册,坐标如下:
22°33.995'(即北纬22度,东经33.995分钟)
变为四个字节 02 23 39 95
这很简单。然而,我的问题是我不知道如何处理南半球的负坐标(例如-25°33.995',就像我们在南非这里一样)
我设法与这个跟踪器的制造商联系,但不幸的是它是一家中国公司,他们的英语不是很好。但他们确实给我发了以下图片:
不幸的是,我并不完全理解这段代码。我非常感谢任何帮助......谢谢。
答案 0 :(得分:2)
if (val&0x80000000)
如果设置了高位,则此if语句将为true。二进制的0x80000000是1,后跟全零。
val&0x7FFFFFFF
该语句将高位设置为零。
0-(val&0x7FFFFFFF)
在将高位设置为零后,这会取消该值。
因此,反过来,您需要使用现有算法将绝对值(abs(raw)
)转换为二进制。假设原始值位于名为raw
的变量中,而二进制文件位于名为binary
的变量中。如果raw是负数,则需要在binary
上设置高位。像这样:
if (raw < 0) {
binary = binary | 0x80000000;
}
&安培;和|按位操作。对参数中的每个位应用和/或逻辑。所以0x1&amp; 0x0 = 0,0x1&amp; 0x1 = 1,0,00 | 0x0 = 0x0,以及0x0 | 0x1 = 0x1。