【问题标题】:Fast way to convert a hexadecimal string to hexadecimal char array将十六进制字符串转换为十六进制字符数组的快速方法
【发布时间】:2014-05-13 12:44:10
【问题描述】:

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

我在 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 中执行相同的操作,但我不知道如何转换它。

谁能帮帮我?

【问题讨论】:

  • 如果你已经有hexadecimal string,那么你可以使用sprintf()将它转换为char数组...我认为这是最快的方式。

标签: c string qt hex


【解决方案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;
for (i = 0; i < sizeof arr; i++) {
    arr[i] = 16 * cvt[(unsigned char)data[2*i]] +
                  cvt[(unsigned char)data[2*i + 1]];
}

【讨论】:

  • 上面的代码适用于偶数个十六进制数字的十六进制字符串。如果需要奇数十六进制字符串,则需要对其进行调整。
  • "ab" 是 171; "5c" 是 92;显然,您的计算机将171 解释为“«”,将92 解释为“\”(ASCII?)。
  • +1 肯定是一种快速的方法。顺便说一句:怀疑你想要cvt[CHAR_MAX+1],但我建议cvt[UCHAR_MAX+1]cvt[(unsigned char) data[2*i]]
  • 是的@chux,谢谢;帖子编辑。但是数组不需要+1
  • @pmg UCHAR_MAX 通常是 255,但通常有 256 个不同的 char,代码 0 到 255。仍然推荐 +1。但我确实看到 '\0' 的值不太可能被引用。
【解决方案2】:

我找到了更快的方法:

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

希望这对某人有所帮助。

【讨论】:

  • “比什么更快”?避免重复调用strtolstrncpy 肯定会更快。
【解决方案3】:

使用sprintf() 以最快的速度从hexadecimal string 转换为hexadecimal char array

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

这里 USER_DIFINED_LENGTH 是可以保存数据的长度。

有关sprintf()的更多信息,请查看http://linux.die.net/man/3/sprintf

【讨论】:

  • 这样,您只需将一个字符串复制到另一个字符串。
猜你喜欢
  • 2018-01-31
  • 2018-01-22
  • 1970-01-01
  • 2014-03-19
  • 1970-01-01
  • 2019-07-27
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多