【问题标题】:Hexadecimal QString representation to Unsigned char array十六进制 QString 表示为无符号字符数组
【发布时间】:2017-08-09 07:35:50
【问题描述】:

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

【问题讨论】:

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


    【解决方案1】:

    您可以遍历您的 QString 并将其分成两部分,然后使用 QString::toUShort(&ok,16),这将为您提供十六进制字符串的 ushort。

    有点像

    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
    }
    

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

    希望这对你有帮助。

    【讨论】:

    • 谢谢!。是的,我首先检查 QString 是否为有效的十六进制字符串。
    • 或转换一次 toULongLong 并忽略前 16 位,因为它们为零。
    【解决方案2】:

    我会这样做:

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

    【讨论】:

      【解决方案3】:

      十六进制到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;
      }
      

      【讨论】:

      • 只有 64 位机器 long long 是 64 位吗?
      • @MABC:至少 64位。在 64 位机器上,您可能会发现 long 是 64 位,而 long long 可能是 128 位。此代码仅依赖于最小尺寸,而不是确切尺寸。
      【解决方案4】:

      你可以试试:

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

      【讨论】:

        猜你喜欢
        • 2011-08-24
        • 1970-01-01
        • 1970-01-01
        • 2013-04-15
        • 1970-01-01
        • 2016-12-14
        • 2015-05-05
        • 2019-05-03
        • 2023-04-11
        相关资源
        最近更新 更多