将十六进制字符串转换为十六进制字符数组的快速方法

时间:2014-04-02 10:04:05

标签: c string qt hex

我需要将包含十六进制数的字符串转换为unsigned char数组。

我在QT中有这段代码:

QString data
...
QByteArray byteArray;
int bufSize = (data.length()) / 2;
for (int i = 0; i < bufSize; i++)
   {
   byteArray[i] = data.mid(2*i, 2).toInt(NULL, 16);//Read the string two characters at a time.
   }

我需要在C中执行相同的操作,我不知道如何转换它。

任何人都可以帮助我吗?

3 个答案:

答案 0 :(得分:6)

最快的方法是使用查找数组:

int cvt[UCHAR_MAX+1] = {0};
cvt['0'] = 0;
cvt['1'] = 1;
// ...
cvt['9'] = 9;
cvt['a'] = 10;
// ...
cvt['f'] = 15;
cvt['A'] = 10;
// ...
cvt['F'] = 15;
for (i = 0; i < sizeof arr; i++) {
    arr[i] = 16 * cvt[(unsigned char)data[2*i]] +
                  cvt[(unsigned char)data[2*i + 1]];
}

答案 1 :(得分:0)

我找到了更快的方式:

char temp[3]={0};
char* p=data;
int bufSize = (strlen(data)) / 2;
for (int i = 0; i < bufSize; i++,p+=2)
{
    //Read the string two characters at a time.
    arr[i]=(unsigned char)(strtol(strncpy(temp,p,2),NULL,16));
}

希望这有助于某人。

答案 2 :(得分:-1)

使用sprintf()实现从hexadecimal stringhexadecimal char array的最快转化。

char buffer[USER_DIFINED_LENGTH];
sprintf(buffer,"%s", your_data);

此处USER_DEFINED LENGTH是可以保存数据的长度。

有关sprintf()支票http://linux.die.net/man/3/sprintf

的更多信息