在qt

时间:2017-07-27 05:41:34

标签: c++ qt qt-creator

我必须从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

2 个答案:

答案 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),使用区域设置的零。对于负数,零填充可能会出现在减号之前。

因此

  1. 5表示结果字符串应至少包含5个字符。
  2. 2表示输出的基数应为2(二进制)
  3. QChar('0')表示如果结果少于5个字符,则填充0个字符,直到结果字符串中有5个字符。
  4. 由于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填充到

最小空间量