qt中用Qdatastream写.dat二进制文件,写入完毕后,打开.dat文件看里面都不是二进制

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了qt中用Qdatastream写.dat二进制文件,写入完毕后,打开.dat文件看里面都不是二进制相关的知识,希望对你有一定的参考价值。

qt中用Qdatastream写.dat二进制文件,写入完毕后,打开.dat文件看里面都不是二进制写入文件的内容是字符串:"964587*6458",手动打开文件里面应该全是乱码啊,让别人看不懂的。
但是却只有前面几个字是乱码,其他都一样还是我写进去的字符串。 我想实现的就是要让数据以二进制形式保存于.dat文件,使其他人看不懂。。

参考技术A 贴代码出来你是怎么写的

在 C# 中使用 QDataStream 读取在 QT 中创建的二进制文件

【中文标题】在 C# 中使用 QDataStream 读取在 QT 中创建的二进制文件【英文标题】:Read binary file created in QT with QDataStream in C# 【发布时间】:2018-07-23 14:05:33 【问题描述】:

我正在尝试使用QDataStream 读取从QT application 创建的现有文件,我正在使用C# 读取它,但我无法正常工作。

这是我用于读取文件的 C# 代码:我没有收到任何错误,只是一个空白 MessageBox

如何使用 C# 使用 QDataStream 读取在QT 创建的文件?

    FileStream readStream;
    string msg = null;
    try 
        readStream = new FileStream(@"C:/MyUsers/SomeFolder/UserNameList.txt", FileMode.Open);
        BinaryReader readBinary = new BinaryReader(readStream);
        msg = readBinary.ReadString();
        MessageBox.Show(msg);
        readStream.Close();
    
    catch (Exception ex) 
        MessageBox.Show(ex.ToString());
    

这是用于在QT 中写入文件的代码。

   QFile UsersNameListFile ("C:/MyUsers/SomeFolder/UserNameList.txt");        
    QString userName = "SomeName";

    QHash<QString, QString> listOfUsers;

    if(!listOfUsers.contains(userName))
    
        listOfUsers.insert(userName, "Some Text");

        if (UsersNameListFile.open(QIODevice::WriteOnly))
        
            QDataStream writeToFile(&UsersNameListFile);
            writeToFile.setVersion(QDataStream::Qt_5_1);
            writeToFile << listOfUsers;

            UsersNameListFile.flush();
            UsersNameListFile.close();
        
    

【问题讨论】:

如果要读取另一个不使用Qt的程序,则使用QDataStream保存是不正确的,因为格式高度依赖Qt,并且在版本和版本之间,QDataStream使用的格式可以差异很大。 非常感谢您的澄清。不幸的是,当创建 QT 应用程序时,不需要像现在一样从另一个应用程序读取文件。 我的建议是你重写你的 C++ 代码,因为 QDataStream 在 Qt 之外是不可移植的,或者为 C# 使用 Qt 包装器 见***.com/questions/33741691/…,使用QtSharp,如果你的软件要大量我会推荐一个更新系统 您是否有任何理由不能使用Qt C# 绑定来读取/处理文件? 【参考方案1】:

不是真正的解决方案,评论太长了。

正如 cmets 中的其他人对您的问题所指出的那样,QDataStream 使用的格式不应被修复。 QDataStream 为您提供了一种方法来设置您使用的格式的版本,以确保不同 Qt 版本之间的向后兼容性,但遗憾的是 Qt 文档缺少每个版本的详细信息。

这里,version 13,是官方文档中当前可用的。这不是最新的事件,这个文档页面只是不经常更新。

无论如何,如果你足够幸运,即你使用的是版本 13,或者 QHash 和 QString 的格式与你当前使用的版本相同,你应该有一个以 unsigned int 32 开头的文件,它代表哈希映射中的元素数量,然后对于每一对,您有两个 QString,每个 QString 再次表示为字符串大小的无符号 int 32,然后表示以 UTF16 编码的字符数组。 Null 或空字符串存储为 0xFFFFFFFF。

类似这样的:

HASH_MAP_COUNT,4 字节,读作 unsigned int 32,告诉你有多少键值对

FIRST_STRING_KEY,4字节,uint 32,告诉你这个key有多长

FIRST_STRING_KEY_DATA,读取为 UTF16 字符

FIRST_STRING_VALUE,4 bytes,uint 32,告诉你这个值有多长

FIRST_STRING_VALUE_DATA,读取为 UTF16 字符

等等……

您可以尝试按照这种格式在 C# 中实现您的阅读功能,如果仍然无法阅读任何内容,那么请努力检查QDataStream&amp; operator&lt;&lt;(QDataStream &amp;out, const QHash&lt;Key, T&gt; &amp;hash) 的实现,以了解您正在使用的特定版本的 qt。您应该可以在 qdatastream.cpp 文件中找到它。

希望这能有所帮助。

【讨论】:

以上是关于qt中用Qdatastream写.dat二进制文件,写入完毕后,打开.dat文件看里面都不是二进制的主要内容,如果未能解决你的问题,请参考以下文章

个人对QT中QBitArray类的剖析

qt 关于二进制文件(类对象)读入的问题

Qt学习之QDataStream

QT中关于Qdatastream使用问题 socket 读数据同时写入file内

Qt中readall返回二进制数据么

qt 读取一个txt文件,把里面的内容已二进制的方式存储到另一个文件里面。