Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/string/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 将十六进制字符串转换为十六进制字符数组的快速方法_C_String_Qt_Hex - Fatal编程技术网

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

C 将十六进制字符串转换为十六进制字符数组的快速方法,c,string,qt,hex,C,String,Qt,Hex,我需要将包含十六进制数的字符串转换为无符号字符数组 我在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.

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

我在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.
   }
QString数据
...
QByteArray byteArray;
int bufSize=(data.length())/2;
对于(int i=0;i
我需要在C中执行相同的操作,但我不知道如何转换它


有人能帮我吗?

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

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]];
}
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;
对于(i=0;i
使用
sprintf()
实现从
十六进制字符串
十六进制字符数组
的最快转换

char buffer[USER_DIFINED_LENGTH];
sprintf(buffer,"%s", your_data);
此处用户定义的长度是可以保存数据的长度

有关
sprintf()
的更多信息,请检查我找到了更快的方法:

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));
}
chartemp[3]={0};
char*p=数据;
int bufSize=(strlen(数据))/2;
对于(int i=0;i

希望这对其他人有所帮助。

如果您已经有了
十六进制字符串
,那么您可以使用
sprintf()
将其转换为字符数组…我认为这是最快的方法。使用此方法,您只需将一个字符串复制到另一个字符串。上面的代码适用于十六进制数字为偶数的十六进制字符串。如果需要奇数十六进制字符串,则需要对其进行调整。
“ab”
为171<代码>“5c”
为92;显然,您的计算机将
171
解释为“«”,将
92
解释为“\”(ASCII?)+1,这无疑是一种快速的方法。顺便说一句:我怀疑你想要
cvt[CHAR\u MAX+1]
,但我建议
cvt[UCHAR\u MAX+1]
cvt[(未签名的CHAR)数据[2*I]]
是@chux,谢谢;后期编辑。阵列不需要
+1
however@pmg
UCHAR\u MAX
通常为255,但通常有256个不同的
char
,代码为0到255。仍然推荐+1。但我确实看到“\0”的a值不太可能被引用。“快”于什么?避免重复调用
strtol
strncpy
肯定会更快。