2011-04-26 2 views
4

У меня есть шестнадцатеричное значение, хранящееся в массиве два байта:Преобразование шестнадцатеричного значения в массиве символов в целое значение

unsigned char hex[2] = {0x02, 0x00}; 

Как я могу преобразовать это десятичное значение?

+1

Это одна из тех ночей ... Не стесняйтесь приносить как можно больше нарушений, как я этого заслужил. Я не уверен, почему, но чем ближе к финалу, тем больше у меня ужасные ужасные упущения в «мышлении». По какой-то причине я думал, что для этого есть нечто большее. Я сам убедился, что это было намного сложнее ... – tgai

+1

@Mitch Wheat: Не беспокойтесь об этом. Вы прокомментировали, что заставили меня сделать паузу на секунду и понять, что я знаю ответ на свой вопрос. Когда я приближаюсь к запуску своего курятника, я нахожу себя в ужасе от ошибок, подобных этому, и выгляжу довольно глупым. Наверное, приятно напоминать, что делать ошибки и/или не вспоминать что-то из моей головы обречено на служение, а не на конец света. – tgai

ответ

6

Вы можете использовать (операция поразрядного)

int b = (hex[0] << 8) | hex[1];

или (простая математика)

int b = (hex[0] * 0x100) + hex[1];

0

Зависит от эндианности, но что-то вроде этого?

short value = (hex[0] << 16) & hex[1]; 
+0

это неверно для '<< 16' и' & '. – MByD

+0

«* зависит от того, какой у вас индейца есть». –

+0

Некоторые причины, почему это неверно: сначала вы меняете первый символ на 16 бит вместо 8 бит. Символ обычно равен 8 бит. Во-вторых, вы ИСПОЛЬЗУете две части, вам нужно ИЛИ их. Перемещая hex [0], вы оставляете первые 16 бит как нули, а когда ANDed с hex [1], вы эффективно удаляете hex [1]. (Поскольку нуль и всегда всегда равны нулю) Спасибо за ввод, хотя! – tgai

0

Это не является эффективным способом, по крайней мере, я не думаю, он будет работать, но он будет работать во всех ситуациях независимо от размера массива и легко преобразуется в b.

__int8 p[] = {1, 1, 1, 1, 1}; //Let's say this was the array used. 
int value = sizeof(p); //Just something to store the length. 
memcpy(&value, &p, value > 4 ? 4 : value); //It's okay to go over 4, but might as well limit it. 

В приведенном выше примере переменная «значение» будет иметь значение 16 843 009. Это эквивалентно, если вы сделали это ниже.

int value = p[0] | p[1] << 0x8 | p[2] << 0x10 | p[3] << 0x18; 
Смежные вопросы