c# - 在 C# 中使用 QDataStream 读取在 QT 中创建的二进制文件
问题描述
我正在尝试读取从QT application
using创建的现有文件QDataStream
,我正在使用C#
它来读取它,但我无法正常工作。
这是我用于读取文件的 C# 代码:我没有收到任何错误,只是一个空白MessageBox
.
如何QT
使用 C# 读取使用 QDataStream 创建的文件?
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();
}
}
解决方案
不是真正的解决方案,评论太长了。
正如其他人在对您的问题的评论中指出的那样, QDataStream 使用的格式不应被修复。QDataStream 为您提供了一种方法来设置您使用的格式的版本,以确保不同 Qt 版本之间的向后兼容性,但不幸的是 Qt 文档缺少每个版本的详细信息。
此处,版本 13是官方文档中当前可用的版本。这不是最新的事件,这个文档页面只是不经常更新。
无论如何,如果您足够幸运,即您使用的是版本 13,或者 QHash 和 QString 的格式与您当前使用的版本相同,您应该有一个以 unsigned int 32 开头的文件,代表元素的数量在你的哈希映射中,然后对于每一对你有两个 QStrings,每个 QStrings 再次表示为一个 unsigned 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字节,uint 32,告诉你这个值有多长
FIRST_STRING_VALUE_DATA,读取为 UTF16 字符
等等 ...
您可以尝试按照这种格式在 C# 中实现您的阅读功能,如果您仍然无法阅读任何内容,那么请努力检查QDataStream& operator<<(QDataStream &out, const QHash<Key, T> &hash)
您正在使用的特定版本的 qt 的实现。您应该能够在 qdatastream.cpp 文件中找到它。
希望这能有所帮助。
推荐阅读
- html - 将值更新到 firebase
- c - 从共享对象文件 (.so) 中获取函数返回类型和参数
- html - 如何在 Laravel 中捕获显示的图像 ID
- vba - 宏 Internet 处理
- jquery - 将 .animate() 与 if/else 语句切换一起使用?
- c# - 带有 SetCustomAnimations 的片段事务在按下时崩溃:指定的孩子已经有一个父母
- javascript - 如何在 Cocos creator Java 脚本中使用 text to Speech 功能 - Android/IOS APP
- sql-server - 每个父记录的子记录重新编号
- sql - GROUP BY 中前一行的值作为列
- sql-server - “使用'BCP(批量复制程序)/批量插入'我们可以将数据从一个服务器1数据库发送到另一个服务器2数据库......吗?”