2016-07-06 6 views
0

Я получаю данные от модуля GPS ublox в битовых битах 24 бит (3 байта из 4-байтового сообщения), и мне нужно преобразовать эти 24-битные поля данных в десятичные значения со знаком, но я могу не найти описание того, как это сделать в спецификации. Также я знаю определенные значения из другой программы, поставляемой вместе с модулем.24-битный тип данных подписки

Для положительных значений кажется, что он просто преобразует двоичное число 24 бит в dec, и это все, например. 0x000C19 = 3097 и 0x000BD0 = 3024, но для отрицательных чисел у меня проблемы. 2, похоже, не работает. Вот некоторые известные значения: 0xFFFFC8 = -57, 0xFCB9FE = -214528, 0xFF2C3B = -54215 и 0xFFFA48 = -1462. Используя дополнение 2, преобразование выполняется с нескольких номеров каждый раз (-56, -214530, -54213, -1464, соответственно). (Hex номера используются, чтобы избежать необходимости писать 24 цифры каждый раз.)

Спасибо за вашу помощь заранее!

+0

Показать Ваш код. – 2501

+0

Вы уверены, что программа, пришедшая с аппаратным обеспечением, вычисляет правильные отрицательные результаты? –

+1

@MoralesBatovski, вопрос не в том, «почему этот код не работает?», Это «что делает эта программа черного ящика?». –

ответ

1

Первые вещи сначала «известные» ценности у вас есть там не то, что вы думаете, что они являются:

#include <stdio.h> 

static void p24(int x) 
{ 
    printf("%8d = 0x%06X\n", x, (0x00ffffff & (unsigned)x)); 
} 

int main(int argc, char *argv[]) 
{ 
    p24(-57); 
    p24(-214528); 
    p24(-54215); 
    p24(-1462); 
    return 0; 
} 

компиляции и запуска на 2s дополнения аппарат печатает

 -57 = 0xFFFFC7 
-214528 = 0xFCBA00 
    -54215 = 0xFF2C39 
    -1462 = 0xFFFA4A 

При преобразовании в 2s вы, конечно же, будете заполнять всю длину целевого типа данных, с которым вы работаете, чтобы знак был правильно перенесен. Затем вы делите тип подписанных данных на заданное количество бит.

Ex:

#include <stdio.h> 
#include <stdint.h> 

/* 24 bits big endian */ 
static char const m57[]  = {0xFF, 0xFF, 0xC7}; 
static char const m214528[] = {0xFC, 0xBA, 0x00}; 
static char const m54215[] = {0xFF, 0x2C, 0x39}; 
static char const m1462[] = {0xFF, 0xFA, 0x4A}; 

static 
int32_t i_from_24b(char const *b) 
{ 
    return (int32_t)(
     (((uint32_t)b[0] << 24) & 0xFF000000) 
     | (((uint32_t)b[1] << 16) & 0x00FF0000) 
     | (((uint32_t)b[2] << 8) & 0x0000FF00) 
    )/256; 
} 

int main(int argc, char *argv[]) 
{ 
    printf("%d\n", i_from_24b(m57)); 
    printf("%d\n", i_from_24b(m214528)); 
    printf("%d\n", i_from_24b(m54215)); 
    printf("%d\n", i_from_24b(m1462)); 
    return 0; 
} 

Напечатает

-57 
-214528 
-54215 
-1462 
+4

Но как этот вопрос отвечает? – 4386427

+0

@ 2501: На самом деле CHAR_BIT> = 8, из-за примененных масок после сдвига. Возможно, пусть функция вернет int32_t. – datenwolf

+1

Разделение на 256 четко определено, но приведение к 'int32_t' имеет поведение, определенное реализацией, если преобразованное значение не представляется в виде' int32_t'. Вы полагаетесь на определенный выбор этого поведения, определенного для реализации. –

0

информация OP является непоследовательным и, вероятно, @John Bollinger комментарий относится: "... Программа выполнения преобразования теряет точность ..."

OP необходимо просмотреть и разместить дополнительную информацию/код.

OP's  OP's 2's comp. Diff 
Hex   Dec  
0xFFFFC8 -57  -56  -1 
0xFCB9FE -214528 -214530  2 
0xFF2C3B -54215 -54213  -2 
0xFFFA48 -1462 -1464  2 

Из-за сложности этого комментария, отправил в ответ

+0

Именно это! Все эти годы проводили изучение исчисления и прочее, и я до сих пор не думал о диапазоне точности! –

0

Спасибо всем за то, чтобы помочь, но я просто понял, что я отсталый и еще более отсталый! Программа, с которой я получил «известные значения», показывает масштабированные значения измеренных данных, и кажется, что отклонение + -1 + -2 находится в диапазоне того же показателя точности, что и после того, как оно было преобразовано, поэтому оно действительно использует 2s-дополнение ,

Извините за свое потерянное время! (SO is awesome tho)

 Смежные вопросы

  • Нет связанных вопросов^_^