我需要将包含十六进制数的字符串转换为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中执行相同的操作,我不知道如何转换它。
任何人都可以帮助我吗?
答案 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 string
到hexadecimal char array
的最快转化。
char buffer[USER_DIFINED_LENGTH];
sprintf(buffer,"%s", your_data);
此处USER_DEFINED LENGTH是可以保存数据的长度。
有关sprintf()
支票http://linux.die.net/man/3/sprintf