Преобразование шестнадцатеричного в десятичное в C - PullRequest
3 голосов
/ 05 апреля 2010

Вот мой код, который выполняет преобразование из шестнадцатеричного в десятичное. Шестнадцатеричные значения хранятся в массиве без знака:

  int liIndex ;
  long hexToDec ;
  unsigned char length[4];

  for (liIndex = 0; liIndex < 4 ; liIndex++)
  {
       length[liIndex]= (unsigned char) *content;
       printf("\n Hex value is %.2x", length[liIndex]);
       content++;
  }
  hexToDec = strtol(length, NULL, 16);

Каждый элемент массива содержит 1 байт информации, и я прочитал 4 байта. Когда я выполняю это, вот вывод, который я получаю:

 Hex value is 00
 Hex value is 00
 Hex value is 00
 Hex value is 01
 Chunk length is 0

Может кто-нибудь, пожалуйста, помогите мне понять ошибку здесь. Десятичное значение Th должно быть равно 1 вместо 0.

С уважением, Негр

Ответы [ 2 ]

2 голосов
/ 05 апреля 2010

Я предполагаю, что вы используете% x в том, что content кодирует ваше шестнадцатеричное число как массив целых чисел, а не как массив символов. То есть вы представляете цифру 0 в content как '\0' или '0'?

strtol работает только в последнем случае. Если content действительно является массивом целых чисел, то следующий код должен помочь:

hexToDec = 0;
int place = 1;
for(int i=3; i>=0; --i)
{
  hexToDec += place * (unsigned int)*(content+i);
  place *= 16;
}
content += 4;
2 голосов
/ 05 апреля 2010

strtol ожидает строку с нулевым символом в конце. length[0] == '\0', и поэтому strtol тут же прекращает обработку. Он преобразует такие вещи, как «0A21», а не такие, как {0,0,0,1}, как у вас.

Каково содержание content и что именно вы пытаетесь сделать? То, что вы создали, кажется мне странным по ряду причин.

...