十六进制QString表示无符号字符数组

时间:2017-08-09 07:35:51

标签: c++ string qt qt-creator qstring

带有一些用户输入的QString包含MAC地址,例如"68F542F9AB22"。我需要将QString转换为数字的unsigned char数组[6],而不是ASCII表示。因此对于QString 68F542F9AB22,第一个位置的unsigned char数组应为104.

4 个答案:

答案 0 :(得分:2)

你可以迭代你的QString并将它切成两部分,然后使用QString :: toUShort(& ok,16),这将为你提供一个你的十六进制字符串。

喜欢

for(int i=0;i<6;++i)
{
     QString hexString = yourstring.mid(i*2,2);
     bool ok = false;
     yourBuf[i] = (unsigned char) hexString.toUShort(&ok,16);
     //if not ok, handle error
}

您应该对输入字符串的正确长度进行一些检查,并对转换错误进行一些错误处理。

希望这对你有所帮助。

答案 1 :(得分:1)

我会按以下方式进行:

QString s("68F542F9AB22");
assert(s.size() % 2 == 0);

std::vector<unsigned char> array;
for (int i = 0; i < s.size(); i += 2)
{
  QString num = s.mid(i, 2);
  bool ok = false;
  array.push_back(num.toUInt(&ok, 16));
  assert(ok);
}

答案 2 :(得分:0)

您可以尝试:

QString s  = "68F542F9AB22";
unsigned char array[6];

if (s.length() % 2 == 0) { // test string length is even
    for (unsigned long i = 0 ; i < s.length() ; i += 2) {
        QString chunk = s.mid(i,2);
        bool ok;
        array[i/2] = static_cast<unsigned char>(chunk.toInt(&ok,16));
    }
}

请注意,上面的代码仅适用于偶数字符串(但对于MAC地址,没关系)。

要测试结果,您可以使用:

for (unsigned long i = 0 ; i < 6 ; i ++) {
    std::cout<<"Array ["<<i<<"] = "<<static_cast<unsigned long>(array[i])<<std::endl;
}

答案 3 :(得分:0)

十六进制到long long是一个操作,最多可转换为64位。这对48位MAC来说已经足够了。所以:

bool ok = false;
auto result = input.toULongLong(&ok,16);
for(int i=5;i>=0;--i)
{
   buf[i] = result & 0xFF;
   result >>= 8;
}