如何使用 QDataStream 在 Python 中打开 bin 文件

2023-12-11

我有一个在应用程序中编码的 bin 文件,我需要访问该文件并将其转换为 csv 文件。我已获得文档,但不确定如何在 Python 中访问该文件的内容。

以下是有关数据集如何序列化的一些详细信息

Datasets.bin 是使用 Qt 的 QDataStream 序列化(使用版本 QDataStream::Qt_4_7)序列化的 DataSet 类的列表。

The format of the datasets.bin file is:

quint32 Magic Number    0x46474247
quint32 Version     1
quint32 DataSet Marker  0x44415441
qint32      # of DataSets       n
DataSet DataSet 1
DataSet DataSet 2
     .
     .
     .
     .
DataSet DataSet n


The format of each DataSet is:

quint32     Magic Number    0x53455455  
QString     Name
quint32     Flags           Bit field (Set Table)
QString     Id          [Optional]  
QColor      Color           [Optional]
qint32          Units           [Optional]
QStringList         Creator Ids     [Optional]
bool            Hidden          [Optional]
QList<double>   Thresholds      [Optional]
QString         Source          [Optional]
qint32          Role            [Optional]
QVector<QPointF>    data points

我一直在查看 PyQt4 数据流文档,但似乎找不到任何具体示例。任何帮助我指明正确方向的帮助都会很棒


PyQt 无法像 C++ 中那样读取所有数据,因为它无法处理模板类(例如QList<double> and QVector<QPointF>),这需要 Python 中不提供的特定于语言的支持。这意味着必须使用解决方法。幸运的是,数据流格式非常简单,因此读取任意模板类可以简化为一个简单的算法:将长度读取为uint32,然后迭代range并将包含的元素一一读入list:

points = []
length = stream.readUInt32()
for index in range(length):
    point = QPoint()
    stream >> point
    points.append(point)

下面的脚本展示了如何正确读取整个数据集格式:

from PyQt4 import QtCore, QtGui

FLAG_HASSOURCE = 0x0001
FLAG_HASROLE = 0x0002
FLAG_HASCOLOR = 0x0004
FLAG_HASID = 0x0008
FLAG_COMPRESS = 0x0010
FLAG_HASTHRESHOLDS = 0x0020
FLAG_HASUNITS = 0x0040
FLAG_HASCREATORIDS = 0x0080
FLAG_HASHIDDEN = 0x0100
FLAG_HASMETADATA = 0x0200

MAGIC_NUMBER = 0x46474247
FILE_VERSION = 1
DATASET_MARKER = 0x44415441
DATASET_MAGIC = 0x53455455

def read_data(path):
    infile = QtCore.QFile(path)
    if not infile.open(QtCore.QIODevice.ReadOnly):
        raise IOError(infile.errorString())

    stream = QtCore.QDataStream(infile)
    magic = stream.readUInt32()
    if magic != MAGIC_NUMBER:
        raise IOError('invalid magic number')
    version = stream.readUInt32()
    if version != FILE_VERSION:
        raise IOError('invalid file version')
    marker = stream.readUInt32()
    if marker != DATASET_MARKER:
        raise IOError('invalid dataset marker')
    count = stream.readInt32()
    if count < 1:
        raise IOError('invalid dataset count')

    stream.setVersion(QtCore.QDataStream.Qt_4_7)

    rows = []
    while not stream.atEnd():
        row = []

        magic = stream.readUInt32()
        if magic != DATASET_MAGIC:
            raise IOError('invalid dataset magic number')

        row.append(('Name', stream.readQString()))

        flags = stream.readUInt32()
        row.append(('Flags', flags))

        if flags & FLAG_HASID:
            row.append(('ID', stream.readQString()))
        if flags & FLAG_HASCOLOR:
            color = QtGui.QColor()
            stream >> color
            row.append(('Color', color))
        if flags & FLAG_HASUNITS:
            row.append(('Units', stream.readInt32()))
        if flags & FLAG_HASCREATORIDS:
            row.append(('Creators', stream.readQStringList()))
        if flags & FLAG_HASHIDDEN:
            row.append(('Hidden', stream.readBool()))
        if flags & FLAG_HASTHRESHOLDS:
            thresholds = []
            length = stream.readUInt32()
            for index in range(length):
                thresholds.append(stream.readDouble())
            row.append(('Thresholds', thresholds))
        if flags & FLAG_HASSOURCE:
            row.append(('Source', stream.readQString()))
        if flags & FLAG_HASROLE:
            row.append(('Role', stream.readInt32()))

        points = []
        length = stream.readUInt32()
        for index in range(length):
            point = QtCore.QPointF()
            stream >> point
            points.append(point)
        row.append(('Points', points))
        rows.append(row)

    infile.close()

    return rows

rows = read_data('datasets.bin')

for index, row in enumerate(rows):
    print('Row %s:' % index)
    for key, data in row:
        if isinstance(data, list) and len(data):
            print('  %s = [%s ... ] (%s items)' % (
                  key, repr(data[:3])[1:-1], len(data)))
        else:
            print('  %s = %s' % (key, data))
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何使用 QDataStream 在 Python 中打开 bin 文件 的相关文章

随机推荐

  • 按顺序进行控制

    我正在使用表单的文本字段创建一个 XML 文件 当我使用For Each loop For each Ctrl in Me Controls dosomething Next 它不按顺序排列它们 也就是说 它首先需要TextBox在中间 然
  • MySQL:选择查询执行和结果获取时间随着连接数量的增加而增加

    我的服务器应用程序通过单独的线程与 MySQL 建立多个连接 每个连接都会触发一个SELECT查询并获取结果 然后应用程序将其返回给其连接的用户 我正在使用InnoDB 令我惊讶的是 我发现很奇怪的是 如果我增加 MySQL 的连接数量 查
  • 取消选择后无法再次选择选项

    我有一个输入 id quickS 和一个选择 id lbSLI L 元素 如下所示 我的 Jquery 代码如下 document ready function quickS keyup function lbSLI L option se
  • 如何在 Python 3 的方法装饰器中调用 super ? [复制]

    这个问题在这里已经有答案了 我该如何填写 def ensure finished iterator try next iterator except StopIteration return else raise RuntimeError
  • R 中存在错误的单纯形函数的基本示例

    早上好 我有一个优化问题 我无法在 R 中解决 但在 Excel 中解决 我想优化以下情况 物资和人员的运输 航空公司x1可运输50吨物资和500人航空公司x2可运输150吨物资和250人 50x1 150x2 gt 900 gt 材料运输
  • NUnit 在 TFS 构建中加载失败

    我遇到了 构建部分成功 问题 并出现此错误 NUnit 无法加载 e Builds 184 CSTax 706USServices Test bin Calc Tests dll 但该项目中的所有单元测试都运行并且通过 全绿色 搭建环境 1
  • 如何使用 Jpackage 为 JavaFX 应用程序制作分发格式

    由于 jar 不再是分发 JavaFX 项目的最佳格式 我愿意使用 JPackage 工具来代替 但在阅读这篇文章后 https stackoverflow com a 68823040 4262407 我最终有多个问题 但首先 我只是想确
  • 在java中使用GZIPOutputStream发送压缩块

    我试图通过 java 套接字发送压缩的 HTML 文件 但浏览器显示一个空的 HTML 文件 问题是 当我尝试发送未压缩的 HTML 时 发现一切正常 是的 我确实相应地修改了 HTTP 标头 private void sendRespon
  • ASP Classic 无法在 IIS 7 上使用 FileSystemObject 访问虚拟目录

    我有一个经典的 ASP 网站 我们已从 IIS 6 迁移到 Win2k8 和 IIS 7 在网站文件夹结构中 有一个名为 Products 的虚拟目录 其中包含物理存储在同一服务器上其他位置的 JPG 在 Web 浏览器中 任何产品 JPG
  • 验证 HTML 中的信息 - 代码定位

    我无法让代码验证正常工作 我已经编写了姓名和电子邮件地址的验证 但是 我不知道在哪里插入命令以便在我的主 html 中调用 php 代码 我想我必须在这样的表单中添加一个操作 div class logo div div class log
  • 启动 angular.bootstrap 后取消引导? [关闭]

    Closed 这个问题需要细节或清晰度 目前不接受答案 尝试重新编译角度应用程序时遇到问题 有没有办法在调用 angular bootstrap 后取消引导 一旦我在已经引导的情况下执行 angular bootstrap 就会导致错误 T
  • 最小化时 pywin32 / pywinauto 在远程桌面中无法正常工作

    我有一个 Jenkins 管道 它在远程服务器中执行一个程序 该服务器使用 pywin 来操作应用程序以进行功能测试 当我打开远程桌面时 我的应用程序运行得很好 但是当我关闭远程桌面并从 Jenkins 运行它时 应用程序就会丢失 我所做的
  • PHP 短三元(“Elvis”)运算符与空合并运算符

    有人可以解释一下之间的区别吗三元运算符简写 and 空合并运算符 在 PHP 中 他们什么时候表现不同 什么时候表现相同 如果真的发生了 a b VS a b Elvis 如果第一个参数包含 true ish 值 则返回它 查看哪些值被认为
  • 如何将上传文件保存到另一台服务器

    我目前正在使用 django 现在我需要将用户上传的文件保存到另一台服务器 该服务器不是为 django 应用程序提供服务的服务器 该文件将保存到文件系统而不是数据库 有人可以告诉我该怎么做吗 默认 Django 行为是将文件保存在文件系统
  • C# 中图像过滤的高速性能

    我有位图 我想对我的位图应用中值过滤器 但我不能使用 GetPixel 和 SetPixel 因为速度对我来说非常重要 我需要非常快速的方法来做到这一点 也许可以通过Graphics DrawImage Image Point Rectan
  • 如何按两个条件对 ruby​​ 数组进行排序

    我想通过两个不同的条件对该数组进行排序 首先 我想按类型对数组进行排序 类型可以是 1 2 3 4 我想按 4 1 2 3 的顺序对它们进行排序 然后 在每种不同的类型中 我想按百分比降序对它们进行排序 因此 排序后的数组将如下所示
  • 如何强制 VB6 使用应用程序目录中的 DLL 和 OCX?

    我想将我的依赖文件放在应用程序目录中 我好像记得你可以强制VB6只使用本地目录中的文件 有什么提示吗 您可能还想尝试设置免注册COM为您的项目 有一个免费软件叫无人值守制作我的清单这将为您完成大部分工作
  • 如何从 RSS itunes 读取图像标签

    我尝试阅读我的 iTunes RSS 我可以阅读标题 甚至 itunes subtitle 但标签图像有问题 FEED
  • 如何用另一个子字符串替换字符串的一部分

    我需要将字符串 on 替换为 in strstr 函数返回一个指向字符串的指针 所以我认为将新值分配给该指针会起作用 但它没有 include
  • 如何使用 QDataStream 在 Python 中打开 bin 文件

    我有一个在应用程序中编码的 bin 文件 我需要访问该文件并将其转换为 csv 文件 我已获得文档 但不确定如何在 Python 中访问该文件的内容 以下是有关数据集如何序列化的一些详细信息 Datasets bin 是使用 Qt 的 QD