在QT'\ n'0x10-> 0x0d,0x010中写入二进制数据

时间:2011-10-19 18:42:28

标签: c++ qt

我从事涉及编写二进制数据的项目,我使用QString存储行,然后通过Qfile将其保存在硬盘上

 data.append(QChar(10));

我将编码设置为“ISO-8859-1”,无论如何当数据等于10 I如上所示时,保存的数据是0x0d,0x0a我发现问题源,10 ='\ n'和Qt改变它''\ n \ r'所以它发生了。

我该如何解决?

2 个答案:

答案 0 :(得分:1)

您的问题答案很差,原因有几个。以下是我立即发现的问题:

  1. 如果您真的正在编写二进制数据,不要使用字符串。由于原因,请阅读并理解以下页面:
    The Absolute Minimum Every Software Developer Absolutely, Positively Must Know About Unicode and Character Sets (No Excuses!)
    QString class documentation
    QChar class documentation
  2. 获取“\ r \ n”的问题源于问题#1,但您不会在基于Linux的操作系统上发现此问题。
  3. 您没有在问题中包含data对象的类型,这意味着我们确实知道data.append(...)正在做什么。确保您的帖子包含short, self contained, correct (compilable), example。此外,在您发布的答案中,没有提及此data对象。
  4. 什么是byte?它不是C ++或Qt的一部分,而且这是你给我们继续的唯一两个标签。
  5. 在你的回答中,你转而使用C ++流。当你绕过使用Qt流所包含的许多“安全”功能时,要小心这样做。如果您已经在使用Qt,请尽可能多地使用它,因为它可以协同工作。

答案 1 :(得分:0)

我找到了原因,因为我创建的QFile对象是在文本模式下,所以当QFile想要写文件时它会更改/ n到/ r / n下面的代码是前面的代码,因为有二进制问题存在QIODevice::Text

QFile myfile;
myfile.setFileName("build/Data.bin");
if(!myfile.open(QIODevice::WriteOnly|QIODevice::Text))
    return;

对于二进制模式,我们可以省略QIODevice::Text,因此第二行更改为

if(!myfile.open(QIODevice::WriteOnly))

起初我认为这是Qt的错误,并尝试使用ofstream来编写文件,同样的事情发生在ofstream上,最后用ofstream编写二进制代码如下所示 这一点是std::ios_base::binary

ofstream file;
file.open ("example.txt", std::ios_base::out | std::ios_base::binary);
file << (byte)10;
file.close();