Координаты широты/долготы в BCD в С#

Я пишу код С# для программирования геозон на GPS-трекере (Sinowell G102). Геозаборы имеют прямоугольную форму. По сути, мне нужно взять координату верхнего левого угла и координату нижнего правого угла и запрограммировать их в трекере. Теперь трекер ожидает эти координаты в формате BCD (Binary-Coded Decimal). Каждая координата имеет длину 4 байта. Теперь я придумал, как преобразовать положительную координату широты или долготы в BCD - согласно руководству по протоколу трекера, координата вида:

22° 33,995′ (т. е. 22 градуса северной широты, 33,995 минуты восточной долготы)

становится четырьмя байтами 02 23 39 95

Что довольно прямолинейно. Моя проблема, однако, в том, что я не знаю, как обращаться с отрицательными координатами Южного полушария (например, -25° 33,995′, как у нас здесь, в Южной Африке).

Мне удалось связаться с производителями этого трекера, но, к сожалению, это китайская фирма, и английский у них не очень. Однако они прислали мне следующее изображение:

введите здесь описание изображения

К сожалению, я не до конца понимаю этот код. Я был бы очень признателен за любую помощь.... Спасибо.


person Fabricio Rodriguez    schedule 28.06.2016    source источник


Ответы (1)


if (val&0x80000000)

Это выражение if будет истинным, если установлен старший бит. 0x80000000 в двоичном формате — это 1, за которой следуют все нули.

val&0x7FFFFFFF

Этот оператор установит старший бит в ноль.

0-(val&0x7FFFFFFF)

Это инвертирует значение после установки старшего бита в ноль.

Итак, обратив это, вы захотите преобразовать абсолютное значение (abs(raw)) в двоичное, используя существующий алгоритм. Скажем, исходное значение находится в переменной с именем raw, а двоичный файл — в переменной с именем binary. Если исходное значение отрицательное, вам нужно установить старший бит на binary. Нравится:

if (raw < 0) {
    binary = binary | 0x80000000;
}

& и | являются побитовыми операциями. Применение и/или логика к каждому из битов в аргументах. Таким образом, 0x1&0x0 = 0, 0x1&0x1 = 1, 0x0|0x0 = 0x0 и 0x0|0x1 = 0x1.

person Nick    schedule 28.06.2016
comment
На лучший ответ я и не надеялся. Спасибо, Ник. Я попробую это сегодня вечером. - person Fabricio Rodriguez; 30.06.2016