将十六进制转换为二进制qt
我必须从MODbus应用程序读取原始数据并将其转换为十六进制。在MODbus中,它以二进制和十六进制显示。假设我想读取5位= 00011
,当我将它转换为十六进制时,它变成了0x03,但是当我再次将它从十六进制转换为二进制时。它显示在我的UI中,只有这样= 11
,其余3个零000
消失。这是我的编码:将十六进制转换为二进制qt
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
使用的QString :: ARG()过载,而不是的QString ::号码()。它有一个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(''))const
fieldWidth指定填充并填充字符fillChar的最小空间量。正值产生右对齐的文本;负值会产生左对齐的文本。
base参数指定将整数a转换为字符串时要使用的基数。基数必须介于2到36之间,8代表八进制数,10进制数和16进制数。
如果fillChar为'0'(数字0,ASCII 48),则使用语言环境的零。对于负数,零填充可能会出现在减号之前。
因此
- 的
5
状态所得到的字符串应具有至少5个字符。 - 的
2
状态,所述输出的基应该是2(二进制) - 的
QChar('0')
状态,如果结果具有小于5个字符,垫0
字符,直到有得到的字符串中5个字符。
由于5是正数,所以0
字符被添加到前面。如果它是-5(负值),那么角色会在后面填充。
例如,如果您有10位,给定以上,没有填充将完成,因为它超过了指定的5。
我不明白什么是accepted answer后不清楚。
如果在您的情况下不起作用,那么其他事情就会出错。 (这是其他评论家已经告诉你的。)
我怎么能说服你呢?
我最后的(绝望)尝试:一个(不那么)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指定一个被填充到
接受的答案对于固定位是完全正确的。但我知道如何去做。对不起有点慢,因为我是一个新手。是啊TQ! – raehee
什么是你的问题/问题的空间最低量? – Scheff
如果您打算输出固定数量的数字的二进制数字(作为文本),您可能应用某种格式... – Scheff
请提出问题,并提供一个最小的,完整的,可验证的示例https:// stackoverflow.com/help/mcve – Nic