Преобразование шестнадцатеричного значения в массиве символов в целое значение

#c #hex #arrays

#c #шестнадцатеричное #массивы

Вопрос:

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

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

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

Комментарии:

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

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

Ответ №1:

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

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

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

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

Ответ №2:

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

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

Комментарии:

1. Часть » зависит от того, какой у вас индеец » верна.

2. Некоторые причины, по которым это неверно: сначала вы сдвигаете первый символ на 16 бит вместо 8 бит. Символ обычно состоит из 8 бит. Во-вторых, вы объединяете две части, вам нужно ИЛИ их. Сдвигая шестнадцатеричное значение [0], вы оставляете первые 16 бит в виде нулей, а при добавлении шестнадцатеричного значения[1] вы эффективно удаляете шестнадцатеричное значение[1]. (Поскольку нуль и значение всегда равно нулю) Хотя спасибо за ввод!

Ответ №3:

Это неэффективный способ, по крайней мере, я так не думаю, но он будет работать во всех ситуациях, независимо от размера массива, и легко преобразуется в 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(amp;value, amp;p, value > 4 ? 4 : value); //It's okay to go over 4, but might as well limit it.
  

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

 int value = p[0] | p[1] << 0x8 | p[2] << 0x10 | p[3] << 0x18;