无法从 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());
因此,text
是 QString
与 QLineEdit 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 值的记忆...
我想从 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());
因此,text
是 QString
与 QLineEdit 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 值的记忆...