2013-06-11 2 views
0

Im получая три Uint8 значения, которые являются наиболее, средних и наименее значащие цифры значения участка:Присоединение шестнадцатеричные значения для создания значения 16bit

EG: Отпечатано в консоли (% C):

1 A 4 

Мне нужно передать их в графический пользовательский интерфейс, который принимает uint16_t. Пока что он делает это неправильно.

uint16_t iChanI = (bgp->iChanIH << 8) + (bgp->iChanIM <<4) + bgp->iChanIL; 
uint16_t iChanQ = (bgp->iChanQH << 8) + (bgp->iChanQM <<4) + bgp->iChanQL; 

[self updateSView:iChanI ichanQ:iChanQ]; 

Могу ли я слить их правильно или просто добавить значения?

Любая помощь очень ценится,

Спасибо,

+0

Выглядит прямо мне. Что-то еще должно быть неправильно. Выведите исходные значения ввода и вывода этого фрагмента. –

+0

* «Я могу слить их правильно или просто добавить значения?» * - почему вы не регистрируете значения или не проверяете их в отладчике для проверки? (Если они напечатаны как «1», «A», «4», то значения равны 0x31, 0x41, 0x34, и результат, вероятно, не тот, который вы хотите.) –

+0

Итак, я получаю шестнадцатеричные значения, и мне нужно преобразуйте их в байтовые значения. –

ответ

0

Сначала необходимо преобразовать каждый шестигранный символ его эквивалент 4 бит (Nybble) представления, а затем объединить их в int16_t, например,

uint8_t to_nybble(char c) 
{ 
    return 'c' >= '0' && c <= '9' ? c - '0' : c - 'A' + 10; 
} 

uint16_t iChanI = (to_nybble(bgp->iChanIH) << 8) | 
        (to_nybble(bgp->iChanIM) << 4) | 
        to_nybble(bgp->iChanIL); 
Смежные вопросы