2013-07-11 162 views
2

我正在開發一個項目,我需要將二進制字符串(QString)寫入(以及將來讀取)。該字符串是HEX格式,像這樣的「00010203040506070a0f01」等等(Qt C++)將QString寫入文件爲Binary

我能走到今天,通過在YouTube上的教程:

void Output() 
{ 
    QString ye("01020a"); 
    QFile file("C:\\Users\\Public\\Documents\\Qt_Projects\\myfile.dat"; 

    if(!file.open(QIODevice::WriteOnly)) 
    { 
     qDebug() << "Could not open file to be written"; 
     return; 
    } 

    QDataStream out(&file); 
    out.setVersion(QDataStream::Qt_5_0); 

    out << ye; 

    file.flush(); 
    file.close(); 
    } 

但是當我打開「MYFILE.DAT」用十六進制編輯器,十六進制值是不同的,QString「ye」被寫入事物的文本一側。

00 00 00 0C 00 30 00 31 00 30 00 32 00 30 00 61 

幫助?

回答

7

你應該在寫之前將其轉換。

QByteArray array = QByteArray::fromHex(ye.toLatin1()); 
file.write(array); 

你並不需要使用QDataStream既然你已經有了QByteArray,可以直接寫。

可以讀取和數據轉換回十六進制表示如下:

QString s = file.readAll().toHex(); 
+0

讓我測試它真正的快速 – mrg95

+0

工作就像一個魅力:) THX我需要接受 – mrg95

+0

只是想知道之前要等待4分鐘,我將如何去閱讀一個文件到QString?我假設這是一個變種,但我錯過了什麼? – mrg95

0
中的QString

每個字符佔用2個字節(使用Unicode)。 您可以諮詢ASCII表以十六進制INT搜索字符的代碼值:

'0': 0x30 
'1': 0x31 
'a': 0x61 

這樣的字符串"01020a"其ASCII碼的順序是:00 30 00 31 00 30 00 32 00 30 00 61

"00 00 00 0C":我認爲它的類型確定的QString。

對不起,我的不良表達,希望它是有用的。

0

將QString保存爲QFile;

QString qStr="abc"; 
qFile.write(qStr.toUtf8().constData()); 

conversion sequences are here; 
    QString => QByteArray => const char* => QFile.write() 

[引用類功能]

QByteArray QString::toUtf8() const; 
const char * QByteArray::constData() const; 
qint64 QIODevice::write(const char * data);