将 00001010 写入 Qfile 会在前面添加另一个 Byte

Posted

技术标签:

【中文标题】将 00001010 写入 Qfile 会在前面添加另一个 Byte【英文标题】:writing 00001010 to Qfile adds another Byte in front 【发布时间】:2016-11-22 12:36:14 【问题描述】:

我正在用 Qt 编写一个工具,我想在其中将二进制数据写入文件。一切正常,除非我试图将十进制值“10”(二进制的 0000 1010)写入文件。在这种情况下,我在另一个字节前面得到一个值为“0000 1101”的附加字节。我在文件中写入多少数据并不重要,只要我写一个 10,我就会得到另一个字节。

我将其分解为以下代码:

#include <QCoreApplication>
#include <QFile>
#include <iostream>
#include <QString>
#include <QDataStream>

int main(int argc, char *argv[])

 QCoreApplication a(argc, argv);

 QString SavePath;
 SavePath = qApp->applicationDirPath();
 SavePath.append("/test.bin");

 QFile file(SavePath.toLocal8Bit().constData());
 if (file.exists())
     file.remove();
 if (!file.open(QIODevice::WriteOnly | QIODevice::Text))
 
    std::cout << "Kann Datei zum Speichern der TP-Daten nicht erstellen." << std::endl;
    std::cout << SavePath.toLocal8Bit().constData() << std::endl;
    return -1;
 


 QDataStream out(&file);
 out.setVersion(QDataStream::Qt_4_3);
 out.setByteOrder(QDataStream::LittleEndian);
 out << qint32(10);

 int test=10;
 out.writeRawData((char*)&test,4 );

 file.write((char*)&test);

 return 1;

我的文件中的输出是:

0d 0a 00 00 00 0d 0a 00 00 00 0d 0a

三个 0x0d 字节是不需要的。在将“9”或“11”写入文件时,我没有得到它们。我的想法不多了。谁能告诉我我做错了什么?

【问题讨论】:

您调用的 QFile::write 重载需要一个以空字符结尾的字符数组。您的代码将表现出未定义的行为。 感谢您的回答! 【参考方案1】:

如果你想要二进制文件,请删除 QIODevice::Text 标志,伙计。 否则在 Windows 中将 CR(0x0D) 符号添加到 LF(0x0A) 符号。

【讨论】:

【参考方案2】:

刚刚解决了Qt论坛的问题:

通过在 open 函数中添加 QIODevice::Text 标志,我将它变成了一个文本文件。删除后一切正常。

【讨论】:

我试图理解您的想法:您大概有意识地将 Text 标志添加到 binary 文件中... :)

以上是关于将 00001010 写入 Qfile 会在前面添加另一个 Byte的主要内容,如果未能解决你的问题,请参考以下文章

Qt,QFile 写入特定行

QFile/QDataStream 写入现有数据

QDataStream 读取和写入的字节数比 QFile::length() 报告的要多

QFile / QTextStream 在写入删除文件时不显示错误

Qt 写入 xml:QIODevice::write (QFile, "D:/logs.xml"): 设备未打开

如何在 Qfile 中写入而不覆盖? [复制]