我必须从MODbus应用程序中读取原始数据并将其转换为十六进制。在MODbus中,它以二进制和十六进制显示。假设我想读取5位= 00011
,当我将其转换为十六进制时,它变为0x03但是当我再次将其从十六进制转换为二进制时。它显示在我的用户界面中,仅显示= 11
,剩余的3个零000
将消失。这是我的编码:
if (my_arguments.num_of_points <=8)
{
for(int x = 0; x < 1; x++)
{
block33.append(block22[9+x]);
}
}
hexVal = block33.toHex(); //for converting to binary
stringValue = "0x " + block33.toHex().toUpper(); //display hex raw value
QString hexadecimalNumber = hexVal;
bool ok = false;
QString binaryNumber = QString::number(hexadecimalNumber.toLongLong(&ok, 16),2);
ui->textEdit->append(binaryNumber);
ui->textEdit->setText("RawValue in Hex = " + hex_rawValue );
输出=
RawValue in Hex = 03
11 //but i read 5 bits so it should show `00011
答案 0 :(得分:3)
使用QString :: arg()重载而不是QString :: number()。它有一个 fieldWidth 参数,可用于填充添加的零:
bool ok;
QString hexString = "0x03";
qDebug() << "BINARY 1: " << QString::number(hexString.toLongLong(&ok, 16),2);
qDebug() << "BINARY 2: " << QString("%1").arg(hexString.toULongLong(&ok, 16), 5, 2, QChar('0'));
输出是:
BINARY 1: "11"
BINARY 2: "00011"
所以从QString::arg()上的文档:
QString QString :: arg(qulonglong a,int fieldWidth = 0,int base = 10,QChar fillChar = QLatin1Char(&#39;&#39;))const
fieldWidth指定填充并填充字符fillChar的最小空间量。正值会产生右对齐文本;负值会产生左对齐文本。
base参数指定将整数a转换为字符串时使用的基数。 base必须在2到36之间,8表示八进制,10十进制和16个十六进制数。
如果fillChar是&#39; 0&#39; (数字0,ASCII 48),使用区域设置的零。对于负数,零填充可能会出现在减号之前。
因此
5
表示结果字符串应至少包含5个字符。2
表示输出的基数应为2(二进制)QChar('0')
表示如果结果少于5个字符,则填充0
个字符,直到结果字符串中有5个字符。 由于5为正,因此0
个字符会添加到前面。如果它是-5(负),则字符将在后面填充。
例如,如果你有10位,如上所述,由于它超过了指定的5,所以不会进行填充。
答案 1 :(得分:0)
我不明白accepted answer后的不清楚。
如果它在你的情况下不起作用,那么其他的事情就做错了。 (这是其他评论员已经告诉过你的。)
我怎么能说服你?
我的最后一次(绝望)尝试:a(不是这样)MCVE:
#include <QDebug>
#include <QString>
int main()
{
QString samples[] = {
"0x0", "0x1", "0x1e", "0x11", "0x1111", "0x111e", "0x111f"
};
enum { n = sizeof samples / sizeof *samples };
for (int i = 0; i < n; ++i) {
const QString &hexString = samples[i];
qDebug() << "Formatted binary output of " << hexString;
for (int j = 1; j < 40; j += 8) {
bool ok;
qDebug()
<< QString("%1: %2")
.arg(j, 2)
.arg(hexString.toULongLong(&ok, 16), j, 2, QChar('0'));
}
}
// done
return 0;
}
编译并测试:
Formatted binary output of "0x0"
" 1: 0"
" 9: 000000000"
"17: 00000000000000000"
"25: 0000000000000000000000000"
"33: 000000000000000000000000000000000"
Formatted binary output of "0x1"
" 1: 1"
" 9: 000000001"
"17: 00000000000000001"
"25: 0000000000000000000000001"
"33: 000000000000000000000000000000001"
Formatted binary output of "0x1e"
" 1: 11110"
" 9: 000011110"
"17: 00000000000011110"
"25: 0000000000000000000011110"
"33: 000000000000000000000000000011110"
Formatted binary output of "0x11"
" 1: 10001"
" 9: 000010001"
"17: 00000000000010001"
"25: 0000000000000000000010001"
"33: 000000000000000000000000000010001"
Formatted binary output of "0x1111"
" 1: 1000100010001"
" 9: 1000100010001"
"17: 00001000100010001"
"25: 0000000000001000100010001"
"33: 000000000000000000001000100010001"
Formatted binary output of "0x111e"
" 1: 1000100011110"
" 9: 1000100011110"
"17: 00001000100011110"
"25: 0000000000001000100011110"
"33: 000000000000000000001000100011110"
Formatted binary output of "0x111f"
" 1: 1000100011111"
" 9: 1000100011111"
"17: 00001000100011111"
"25: 0000000000001000100011111"
"33: 000000000000000000001000100011111"
注意:
冒号前面的数字(:
)提供使用的字段宽度。
如果结果数字无法正确显示,并且以字段宽度提供的位数,则示例输出显示输出可能会变长。
这与文档中描述的完全相同。 (由我强调):
fieldWidth指定a填充到
的最小空间量