将hex转换为int的C代码

时间:2011-02-09 23:15:13

标签: c arrays hex

我正在编写此代码以将十六进制条目转换为其等效的整数。所以A将是10而B将是11等。这个代码很奇怪,因为它是seg。随机位置的故障,包括额外的换行符,有时会使它工作。我正在尝试调试它,这样我才能理解我在这里做错了什么。任何人都可以看看并帮助我吗?非常感谢你的时间。

/ *修正了任何感兴趣的人的工作代码* /

         #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 个答案:

答案 0 :(得分:2)

我们来看看。

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()
{

取决于“隐含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,所以这会尝试读取数组的末尾(给出未定义的行为)。

答案 1 :(得分:2)

这对于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 :(得分:0)

问题在于计算numberOfChars部分。 sizeof test实际上是指针的大小,而不是数组中所有字符的总长度,因此代码中返回的数字将为1,这使得for循环转到第二个测试索引({{ 1}})最后没有test[1]。尝试使用\0计算strlen

答案 3 :(得分:0)

这可能不是最理想的方法,但它应该可以正常工作。

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;
}