C-код для преобразования hex в int - PullRequest
0 голосов
/ 10 февраля 2011

Я пишу этот код для преобразования шестнадцатеричной записи в ее целочисленный эквивалент. Таким образом, A будет 10, а B будет 11 и т. Д. Этот код действует странно, так как он сегментирован. ошибки в случайных местах, включая время от времени дополнительный символ новой строки, заставят его работать. Я пытаюсь отладить его, просто чтобы понять, что я здесь делаю неправильно. Кто-нибудь может взглянуть и помочь мне здесь? Большое спасибо за ваше время.

/ * Исправлен рабочий код для всех, кто заинтересован * /

         #include <stdio.h>
            #include <stdlib.h>


            unsigned int hextoint(const char temp[])
            {

            int i;
            int answer = 0;
            int dec;
            char hexchar[] = "aAbBcCdDeEfF" ;


            for ( i=0; temp[i] != '\0'; i++ )
            {

                if ( temp[i] == '\0')
                {

                    return ;        
                }

                if (temp[i] == '0' || temp[i] == 'x' || temp[i] == 'X' )
                {       
                    printf("0");
                    answer = temp[i];
                }

                // compare each temp[i] with all contents in hexchar[]
                int j;
                int a = temp[i];
                for ( j=0; hexchar[j] != '\0'; j++)
                {
                    if ( temp[i] == hexchar[j] )
                    {
                    answer *= 16;
                    answer = answer + 10 + (j/2);
  //                    printf("%d\n",answer );
                    break;      
                    }
                }

            }

            return answer;  

            }


            main()
            {
            char *test[] = 
            {   "bad",
                "aabbdd"
                "0100",
                "0x1",
                "0XA",
                "0X0C0BE",
                "abcdef",
                "123456",
                "0x123456",
                "deadbeef", 
                "zog_c"
            };

            int answer=0;

            // Calculate the number of char's.
            int numberOfChars;
            numberOfChars = sizeof test /sizeof test[0];

            printf("main():Number of chars = %d\n",numberOfChars);
            int i;
            // Go through each character and convert Hex to Integers.
            for ( i = 0; i<numberOfChars;i++)
            {
                // Need to take the first char and then go through it and convert            
                                        it.
                answer = hextoint(test[i]);
                printf("%d\n",answer ); 
            }


            }

Ответы [ 4 ]

2 голосов
/ 11 сентября 2012

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

unsigned int hexToInt(const char *hex)
  {
    unsigned int result = 0;

    while (*hex)
      {
        if (*hex > 47 && *hex < 58)
          result += (*hex - 48);
        else if (*hex > 64 && *hex < 71)
          result += (*hex - 55);
        else if (*hex > 96 && *hex < 103)
          result += (*hex - 87);

        if (*++hex)
          result <<= 4;
      }

    return result;
  }
2 голосов
/ 10 февраля 2011

Давайте посмотрим.

unsigned int hextoint(const char temp[])
{
    int i;
    int answer = 0;
    char hexchar[] = "aAbBcCdDeEfF" ;

    for ( i=0; temp[i] != '\0'; i++ )
    {
        printf("In here");
        printf("%c\t",temp[i] );
    }

    return answer;  
}

Кажется, что это даже не попытка сделать какое-либо преобразование. Он всегда должен возвращать 0, поскольку answer никогда не назначается никакое другое значение. Обычно вы делаете что-то вроде:

for (i=0; input[i] != '\0'; i++) {
    answer *= 16;
    answer += digit_value(input[i]);
}
return answer;

Где digit_value (достаточно очевидно) возвращает значение отдельной цифры. Один из способов сделать это:

int digit_value(char input) { 
    input = tolower(input);
    if (input >= '0' && input <= '9')
        return input - '0';
    if (input >= 'a' && input <= 'f')
        return input - 'a' + 10;
    return -1; // signal error.
}

Затем, глядя на main:

main()
{

В зависимости от правила «implicit int» обычно плохая практика, по крайней мере, IMO. Намного лучше указать тип возвращаемого значения.

// Calculate the number of char's.
int numberOfChars;
numberOfChars = sizeof test /sizeof test[0];

Это фактически вычисляет количество строк, а не число char с.

for ( i = 0; i<=numberOfChars;i++)

Допустимые подписки выполняются от 0 до количества элементов - 1, поэтому при этом выполняется попытка чтения за концом массива (с неопределенным поведением).

0 голосов
/ 08 ноября 2018

Возможно, это не самый оптимальный метод, но он должен работать без проблем.

unsigned int hex_to_int(const char* hex) {
    unsigned int result = 0;
    size_t len = strlen(hex);
    for (size_t i = 0; i < len; ++i) {
        char cur_char = tolower(hex[len - i - 1]);
        // direct return if encounter any non-hex character.
        if (!(isdigit(cur_char) && (cur_char >= 'a' && cur_char <= 'f'));) 
            return result;

        unsigned int char_val = (isdigit(cur_char) ? cur_char - '0' : 10 + cur_char - 'a');
        result += round(pow(16, i)) * char_val;
    }
    return result;
}
0 голосов
/ 10 февраля 2011

Проблема с вычислением numberOfChars части. sizeof test на самом деле размер указателя, а не общая длина всех символов в вашем массиве, поэтому число, возвращаемое в вашем коде, будет равно 1, что заставляет цикл for перейти ко второму индексу теста (test[1]) который не имеет \0 в конце. Попробуйте использовать strlen для расчета numberOfChars.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...