2017-07-27 154 views
-4

我必須從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 
+0

什麼是你的問題/問題的空間最低量? – Scheff

+0

如果您打算輸出固定數量的數字的二進制數字(作爲文本),您可能應用某種格式... – Scheff

+0

請提出問題,並提供一個最小的,完整的,可驗證的示例https:// stackoverflow.com/help/mcve – Nic

回答

3

使用的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),則使用語言環境的零。對於負數,零填充可能會出現在減號之前。

因此

  1. 5狀態所得到的字符串應具有至少5個字符。
  2. 2狀態,所述輸出的基應該是2(二進制)
  3. QChar('0')狀態,如果結果具有小於5個字符,墊0字符,直到有得到的字符串中5個字符。

由於5是正數,所以0字符被添加到前面。如果它是-5(負值),那麼角色會在後面填充。

例如,如果您有10位,給定以上,沒有填充將完成,因爲它超過了指定的5。

+0

是的,我知道了。 TQ!但是QChar('0')在那裏的功能是什麼?以及5,2,?對不起,我是qt – raehee

+0

sory中的一個新手,但是我只給出了5個比特,例如,如果我想讀取任何我想要的比特,你能幫助我嗎? – raehee

+0

,因爲我有選擇,我可以讀取高達2048位, – raehee

0

我不明白什麼是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指定一個被填充到

+0

接受的答案對於固定位是完全正確的。但我知道如何去做。對不起有點慢,因爲我是一個新手。是啊TQ! – raehee

相關問題