我想从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());
答案 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());
因此,text
是QString
,其中包含QLineEdit qTxtIn
(信号发送方)的当前文本。 (或者,我可以使用qTxtIn.text()
。)QString
在内部使用某种Unicode编码(在Windows上可能是UTF-16)。
QByteArray::fromHex()
可以解释将十六进制数字转换为字节值的文本输入。唯一的问题 - 它希望QByteArray
作为输入。
因此,使用方法QString
将QByteArray
转换为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中编译和测试:
正如你所看到的,我对ASCII值的记忆表示了不满......