无法从 Qlinedit 获取 20 字节的十六进制输入并存储到 Qstring

Unable to take a 20 byte hex input from Qlinedit and store into Qstring

我想从 QlinEdit 中获取 20 字节的十六进制输入,并且我只想验证 QlinEdit 的 20 字节并将其存储到 QString 中。

我已完成试用:

ui->SetValue->setMaxLength(4);
ui->SetValue->setInputMask("Hh hh hh hh");

但是它给了我 11 个字节而不是 4 个字节。

并且十六进制值在 QString 中不是成对出现的。我该怎么办?

我已经尝试了一切,但我做不到。

我用过:

ui->SetValue->setInputMask("Hh hh hh hh");

    else if (ui->checkBox_HEX->isChecked())
    {
        ui->SetValue->setEnabled(true);

        obj = ui->SetValueUniqueId->text();

        QByteArray bytes = obj.toLatin1();

        int length = myHexArray.size(); //Number of bytes

        printf("Number Of bytes = %d", length);


        memcpy(buffer, obj.toStdString().c_str(), obj.size());

因为我从未使用过 QLineEdit::setInputMask() before, I made an MCVE – 提供答案以及自娱自乐。

此示例中有两个重要部分:

qTxtIn.setInputMask(
  QString::fromLatin1(
    "HH HH HH HH HH HH HH HH HH HH HH HH HH HH HH HH HH HH HH HH"));

QLineEdit 的输入掩码设置为接受 20 × 2 个字符,其中 "Hexadecimal character required. A-F, a-f, 0-9." (记住,一个字节 → 两个十六进制数字。)

(注意 h 反对允许十六进制数字但不要求。)

另一部分在我用作信号处理程序的 lambda 中,将十六进制数字输入转换为相应的字节值:

QByteArray bytes = QByteArray::fromHex(text.toLatin1());

因此,textQStringQLineEdit qTxtIn(信号发送者)的当前文本。 (或者,我可以使用 qTxtIn.text()。)QString 在内部使用某种 Unicode 编码(在 Windows 上可能是 UTF-16)。

QByteArray::fromHex() 可以将文本输入解码十六进制数字解释为字节值。唯一的问题——它需要一个 QByteArray 作为输入。

因此,使用 QString::toLatin1() 方法将 QString 转换为 QByteArray(在应用于 QByteArray::fromHex() 之前)。考虑一下 Latin1 provides much less characters than Unicode。然而,对于十六进制数字,这确实没有问题,因为数字 0 ... 9 以及字母 a ... f(和 A ... F)在 Latin1 中也可用。

剩下的就是我认为的娱乐——在我的例子中,将字节转换为 C 字符串以使其再次可打印。

完整示例代码testQLineEdit-Hex.cc:

#include <QtWidgets>

typedef unsigned char uchar;

int main(int argc, char **argv)
{
  // build appl.
  qDebug() << "Qt Version: " << QT_VERSION_STR;
  QApplication app(argc, argv);
  // build GUI
  QWidget qMainWin;
  QGridLayout qGrid;
  QLabel qLblIn(QString::fromUtf8("Input (20 hex bytes):"));
  qGrid.addWidget(&qLblIn, 0, 0);
  QLineEdit qTxtIn;
  qTxtIn.setInputMask(
    QString::fromLatin1(
      "HH HH HH HH HH HH HH HH HH HH HH HH HH HH HH HH HH HH HH HH"));
  qGrid.addWidget(&qTxtIn, 0, 1);
  QLabel qLblOut(QString::fromUtf8("Output (C string):"));
  qGrid.addWidget(&qLblOut, 1, 0);
  QLineEdit qTxtOut;
  qTxtOut.setReadOnly(true);
  qGrid.addWidget(&qTxtOut, 1, 1);
  qMainWin.setLayout(&qGrid);
  qMainWin.show();
  // install signal handlers
  QObject::connect(&qTxtIn, &QLineEdit::textEdited,
    [&qTxtOut](const QString &text) {
      // get bytes from input
      QByteArray bytes = QByteArray::fromHex(text.toLatin1());
      // encode bytes as C String
      QString textOut;
      for (const char c : bytes) {
        switch (c) {
          case '\"': textOut += QString::fromLatin1("\\""); break;
          case '\a': textOut += QString::fromLatin1("\a"); break;
          case '\b': textOut += QString::fromLatin1("\b"); break;
          case '\f': textOut += QString::fromLatin1("\f"); break;
          case '\n': textOut += QString::fromLatin1("\n"); break;
          case '\r': textOut += QString::fromLatin1("\r"); break;
          case '\t': textOut += QString::fromLatin1("\t"); break;
          case '\v': textOut += QString::fromLatin1("\v"); break;
          case '\': textOut += QString::fromLatin1("\\"); break;
          default:
            if (c >= ' ' && c < '\x7f') textOut += c;
            else textOut += QString("\%1").arg((int)(uchar)c, 3, 8, QChar('0'));
        }
      }
      qTxtOut.setText(textOut);
    });
  // exec. application
  return app.exec();
}

我在 Windows 10(64 位)上使用 Qt 5.9.2 在 VS2013 中编译和测试:

如您所见,我练习了对 ASCII 值的记忆...