Python 使用非Qt从qtqjsondocument::toBinaryData读取二进制Json?

Python 使用非Qt从qtqjsondocument::toBinaryData读取二进制Json?,python,c++,json,qt,jsoncpp,Python,C++,Json,Qt,Jsoncpp,我有以下JSON结构: "{ "dateTime": "02/06/2016 - 13:01:06", "event": 12344, "eventOwner": "1", "condition": "", "ownerParent": "", "sn": "0000000000" }" 我使用Qt框架QJsonDocument::toBinaryData()函数将其写成二进制文件头/水印 但是,我不能用Python和/或标准C++来解析它,以便

我有以下JSON结构:

"{
    "dateTime": "02/06/2016 - 13:01:06",
    "event": 12344,
    "eventOwner": "1",
    "condition": "",
    "ownerParent": "",
    "sn": "0000000000"
}"
我使用Qt框架QJsonDocument::toBinaryData()函数将其写成二进制文件头/水印

但是,我不能用Python和/或标准C++来解析它,以便再次使用JSON。 Qt似乎也在这个二进制数据上写了一个头,标记为“qbjs1”,然后是原始数据(Qt二进制JSON版本1)

但是,有些“\0”无法将二进制数据解析为JSON。详情如下:

JSON二进制数据中的hexdump:

00000000  71 62 6a 73 01 00 00 00  c0 00 00 00 0d 00 00 00  |qbjs............|
00000010  a8 00 00 00 9b 03 00 00  08 00 64 61 74 65 54 69  |..........dateTi|
00000020  6d 65 00 00 15 00 30 32  2f 30 36 2f 32 30 31 36  |me....02/06/2016|
00000030  20 2d 20 31 33 3a 30 31  3a 30 36 00 1a f3 02 00  | - 13:01:06.....|
00000040  06 00 65 76 65 6e 74 1b  0d 00 00 07 00 65 76 65  |..event......eve|
00000050  6e 74 4f 77 6e 65 72 00  00 00 08 00 31 00 00 1b  |ntOwner.....1...|
00000060  0e 00 00 0b 00 63 6f 6e  64 69 74 69 6f 6e 00 00  |.....condition..|
00000070  00 00 00 00 00 1b 10 00  00 06 00 6f 77 6e 65 72  |...........owner|
00000080  50 61 72 65 6e 74 0b 00  34 35 20 66 6f 72 6b 65  |Parent..45 forke|
00000090  64 00 00 00 9b 13 00 00  05 00 73 6e 00 0d 00 30  |d.........sn...0|
000000a0  30 30 30 30 30 30 30 30  30 0c 00 00 00 34 00 00  |000000000....4..|
000000b0  00 40 00 00 00 5c 00 00  00 74 00 00 00 90 00 00  |.@...\...t......|
000000c0  00 0d                                             |..|
000000c2

我如何用非QtC++和Python?< /p> 解析这个二进制数据,因为这不是标准格式,而是Qt特有的特殊格式,可能没有非Qt库来解析它。 此外,由于它是无文档且内部的,所以不能保证它在不同版本的Qt.1之间是相同的

如果您愿意阅读Qt源代码(确保不会对您施加任何您不想要的许可证限制),那么该格式似乎在中得到了很好的记录。因此,您可以为这种格式编写自己的解析器。您甚至可以从该
序列化
目录的其余部分借用源代码来完成大部分工作

否则,唯一的选择就是通过查看各种JSON和Qt二进制JSON等价物并找出每种值的存储方式,对其进行反向工程。(不能太复杂;JSON没有那么多内容…)



一,。事实上,源代码中的文档有一个很大的明确警告:“此文件不是Qt API的一部分。它纯粹是作为实现细节存在的。此头文件可能会在不通知的情况下从一个版本更改到另一个版本,甚至被删除。”

docs:二进制表示也是Qt内部使用的本机格式,而且转换效率高,速度快。说它是内部的,意味着您可以在不事先通知的情况下从一个版本更改到另一个版本,因此没有单一的方法来进行更改,这与QDataStream的情况类似。因为这不是标准格式,而是Qt特有的特殊格式,所以很有可能没有非Qt库来解析它。如果在某个地方记录了该格式,您可以根据该文档自己编写一个。如果没有,您可以通过读取Qt源代码对其进行反向工程,但这可能会使您承担其许可证的义务,或者您可以根据第一原则对其进行反向工程。您是否有理由不能编写一个简单的工具,使用Qt在Qt二进制JSON中进行流式处理,然后输出真正的JSON,反之亦然,通过这个工具从非Qt C++或Python程序中得到管道数据?顺便说一下,从我可以从快速扫描中看出, 0 字节大部分是用来填充东西的,所以除了字符串,所有的东西都是01:01固定的或是可计算的偏移量。这大概就是为什么它“没有那么节省空间……但访问速度要快得多”。