Converting a hex string to a byte array

后端 未结 19 2228
时光取名叫无心
时光取名叫无心 2020-11-22 12:10

What is the best way to convert a variable length hex string e.g. \"01A1\" to a byte array containing that data.

i.e converting this:

st         


        
19条回答
  •  予麋鹿
    予麋鹿 (楼主)
    2020-11-22 13:08

    The difficulty in an hex to char conversion is that the hex digits work pairwise, f.ex: 3132 or A0FF. So an even number of hex digits is assumed. However it could be perfectly valid to have an odd number of digits, like: 332 and AFF, which should be understood as 0332 and 0AFF.

    I propose an improvement to Niels Keurentjes hex2bin() function. First we count the number of valid hex digits. As we have to count, let's control also the buffer size:

    void hex2bin(const char* src, char* target, size_t size_target)
    {
        int countdgts=0;    // count hex digits
        for (const char *p=src; *p && isxdigit(*p); p++) 
            countdgts++;                            
        if ((countdgts+1)/2+1>size_target)
            throw exception("Risk of buffer overflow"); 
    

    By the way, to use isxdigit() you'll have to #include .
    Once we know how many digits, we can determine if the first one is the higher digit (only pairs) or not (first digit not a pair).

    bool ishi = !(countdgts%2);         
    

    Then we can loop digit by digit, combining each pair using bin shift << and bin or, and toggling the 'high' indicator at each iteration:

        for (*target=0; *src; ishi = !ishi)  {    
            char tmp = char2int(*src++);    // hex digit on 4 lower bits
            if (ishi)
                *target = (tmp << 4);   // high:  shift by 4
            else *target++ |= tmp;      // low:  complete previous  
        } 
      *target=0;    // null terminated target (if desired)
    }
    

提交回复
热议问题