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

时间:2017-11-28 08:53:51

标签: c++ qt qt4

我想从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());

1 个答案:

答案 0 :(得分:1)

由于我之前从未使用过QLineEdit::setInputMask(),我提出了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个字符,其中“需要十六进制字符.A-F,a-f,0-9”。 (请记住,一个字节→两个十六进制数字。)

(请注意,h相反允许十六进制数字,但不需要。)

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

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

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

QByteArray::fromHex()可以解释将十六进制数字转换为字节值的文本输入。唯一的问题 - 它希望QByteArray作为输入。

因此,使用方法QStringQByteArray转换为QByteArray::fromHex()(在应用于QString::toLatin1()之前)。请注意,Latin1提供的字符少于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中编译和测试:

Snapshot of test-QLineEdit-Hex

正如你所看到的,我对ASCII值的记忆表示了不满......