2014-04-02 65 views
2

我需要将包含十六进制数字的字符串转换为无符号字符数组。将十六进制字符串转换为十六进制字符数组的快速方法

我有这样的代码在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相同的动作,我不知道如何将它转换。

任何人都可以帮助我吗?

+1

如果你已经有'十六进制字符串',那么你可以使用'sprintf()'将其转换为char数组......我认为这是最快的方法。 – someone

回答

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]]; 
} 
+0

我试过这个代码,它没有工作。即G。 “ab5”=>“«P«ְ” – user3114639

+0

上面的代码适用于偶数个十六进制数字的十六进制字符串。如果你需要奇数的十六进制字符串,你需要调整它。 – pmg

+0

我又试了一次。对于“ab5c”,我得到了“\”。 – user3114639

-1

使用sprintf()为最快皈依从hexadecimal stringhexadecimal char array

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

此处USER_DIFINED_LENGTH是可容纳您的数据的长度。

sprintf()检查http://linux.die.net/man/3/sprintf

+1

与此相同,您只需将一个字符串复制到另一个字符串即可。 – Ryzhehvost

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

希望这可以帮助别人。

+1

“更快”比什么?避免重复调用'strtol'和'strncpy'肯定会更快。 – usr2564301

相关问题