Convert hex string (char []) to int?

前端 未结 13 1073
栀梦
栀梦 2020-11-22 12:12

I have a char[] that contains a value such as \"0x1800785\" but the function I want to give the value to requires an int, how can I convert this to an int? I have searched a

13条回答
  •  耶瑟儿~
    2020-11-22 12:48

    One quick & dirty solution:

    // makes a number from two ascii hexa characters
    int ahex2int(char a, char b){
    
        a = (a <= '9') ? a - '0' : (a & 0x7) + 9;
        b = (b <= '9') ? b - '0' : (b & 0x7) + 9;
    
        return (a << 4) + b;
    }
    

    You have to be sure your input is correct, no validation included (one could say it is C). Good thing it is quite compact, it works with both 'A' to 'F' and 'a' to 'f'.

    The approach relies on the position of alphabet characters in the ASCII table, let's peek e.g. to Wikipedia (https://en.wikipedia.org/wiki/ASCII#/media/File:USASCII_code_chart.png). Long story short, the numbers are below the characters, so the numeric characters (0 to 9) are easily converted by subtracting the code for zero. The alphabetic characters (A to F) are read by zeroing other than last three bits (effectively making it work with either upper- or lowercase), subtracting one (because after the bit masking, the alphabet starts on position one) and adding ten (because A to F represent 10th to 15th value in hexadecimal code). Finally, we need to combine the two digits that form the lower and upper nibble of the encoded number.

    Here we go with same approach (with minor variations):

    #include 
    
    // takes a null-terminated string of hexa characters and tries to 
    // convert it to numbers
    long ahex2num(unsigned char *in){
    
        unsigned char *pin = in; // lets use pointer to loop through the string
        long out = 0;  // here we accumulate the result
    
        while(*pin != 0){
            out <<= 4; // we have one more input character, so 
                       // we shift the accumulated interim-result one order up
            out +=  (*pin < 'A') ? *pin & 0xF : (*pin & 0x7) + 9; // add the new nibble
            pin++; // go ahead
        }
    
        return out;
    }
    
    // main function will test our conversion fn
    int main(void) {
    
        unsigned char str[] = "1800785";  // no 0x prefix, please
        long num;
    
        num = ahex2num(str);  // call the function
    
        printf("Input: %s\n",str);  // print input string
        printf("Output: %x\n",num);  // print the converted number back as hexa
        printf("Check: %ld = %ld \n",num,0x1800785);  // check the numeric values matches
    
        return 0;
    }
    

提交回复
热议问题