• 24256阅读
  • 11回复

QT 中使用zip文件?qCompress和qUncompress使用的什么算法啊 [复制链接]

上一主题 下一主题
离线cx_star
 

只看楼主 倒序阅读 楼主  发表于: 2009-09-22
想在程序中使用zib文件,已经可以解析文件的格式了。数据解压那块出了问题。
qCompressqUncompress不也是调用的ZLIB的函数吗?
 

使7-zip看到的信息:


 

使用16进制编辑器看到的数据:

根据general format of a zip file这部分的数据格式是:
[pre]  overall zipfile format:
[/pre][pre]    [local file header + file data + data_descriptor] . . .
[/pre][pre]    [central directory] end of central directory record
[/pre][pre]  a.  local file header:
[/pre][pre]        local file header signature     4 bytes  (0x04034b50)
[/pre][pre]        version needed to extract       2 bytes
[/pre][pre]        general purpose bit flag        2 bytes
[/pre][pre]        compression method              2 bytes
[/pre][pre]        last mod file time              2 bytes
[/pre][pre]        last mod file date              2 bytes
[/pre][pre]        crc-32                          4 bytes
[/pre][pre]        compressed size                 4 bytes
[/pre][pre]        uncompressed size               4 bytes
[/pre][pre]        filename length                 2 bytes
[/pre][pre]        extra field length              2 bytes
[/pre][pre]        filename (variable size)
[/pre][pre]        extra field (variable size)
[/pre][pre]  b.  file data
[/pre][pre]  c.  data descriptor:
[/pre][pre]        crc-32                          4 bytes
[/pre][pre]        compressed size                 4 bytes
[/pre][pre]        uncompressed size               4 bytes
[/pre]
程序提取到的file data部分
size: 161
 5d 8d cd  a c2 30 10 84 cf  6 f2  e 4b bc a4 45 2b 9e d5 82 f8 73 af de 14
  f 21 2e ed 42 4d 43 9a aa 28 be bb 49 45  f ee 61 99 19 3e 66 86 64 74 dd
 9d 11 e6 85 5f 35  e 27 45 fc 4b 6b 6b d2 ca 53 63 72 ce 7e 8c 68 1f 64 b3
 4a 70 c6 19 19  f 17 45 46 46 a1 5c a9 47 a0 2b e5 20  d fa 7a 3c 25 9c 3d
 39 83 70 ff 85 a0 e4  7 8f 60 32 e3 6c b0 3f 90 4d a1 85  5 18 bc 41 74 b2
 cf db 71 de 58 34 5b aa 51 8a 69 16 b6 c5 37 2f d1 6f d6 bb 1e fb ac 38 f4
 9d  b dd 19 de 51 f7 f9 8b b3 37 "
根据qUncompress的要求:
Note: If you want to use this function to uncompress external data compressed using zlib, you first need to prepend four bytes to the byte array that contain the expected length of the uncompressed data encoded in big-endian order (most significant byte first).

增加大小信息后的数据
 size: 165
 0  0  0 dd 5d 8d cd  a c2 30 10 84 cf  6 f2  e 4b bc a4 45 2b 9e d5 82 f8
 73 af de 14  f 21 2e ed 42 4d 43 9a aa 28 be bb 49 45  f ee 61 99 19 3e 66
 86 64 74 dd 9d 11 e6 85 5f 35  e 27 45 fc 4b 6b 6b d2 ca 53 63 72 ce 7e 8c
 68 1f 64 b3 4a 70 c6 19 19  f 17 45 46 46 a1 5c a9 47 a0 2b e5 20  d fa 7a
 3c 25 9c 3d 39 83 70 ff 85 a0 e4  7 8f 60 32 e3 6c b0 3f 90 4d a1 85  5 18
 bc 41 74 b2 cf db 71 de 58 34 5b aa 51 8a 69 16 b6 c5 37 2f d1 6f d6 bb 1e
 fb ac 38 f4 9d  b dd 19 de 51 f7 f9 8b b3 37 "
调用函数 出现错误:
qUncompress: Z_DATA_ERROR: Input data is corrupted
 
 
 
这个是用WINRAR解压后文件zipTest/main.cpp:
QFile ff("。。。。");
QByteArray bb = QByteArray(ff.readAll());
bb中数据:
size: 221
 23 69 6e 63 6c 75 64 65 20 3c 51 74 43 6f 72 65 2f 51 43 6f 72 65 41 70 70

 6c 69 63 61 74 69 6f 6e 3e 0d a 23 69 6e 63 6c 75 64 65 20 22 73 7a 69 70

 2e 68 22 d a d a 69 6e 74 20 6d 61 69 6e 28 69 6e 74 20 61 72 67 63 2c

 20 63 68 61 72 20 2a 61 72 67 76 5b 5d 29 d a 7b d a 20 20 20 20 51 43

 6f 72 65 41 70 70 6c 69 63 61 74 69 6f 6e 20 61 28 61 72 67 63 2c 20 61 72

 67 76 29 3b d a 9 53 5a 69 70 2a 20 73 20 3d 20 6e 65 77 20 53 5a 69 70

 28 29 3b d a 9 73 2d 3e 6f 70 65 6e 46 69 6c 65 28 22 31 2e 7a 69 70 22

 29 3b d a 9 73 2d 3e 67 65 74 45 44 52 28 29 3b d a d a 20 20 20 20

 72 65 74 75 72 6e 20 61 2e 65 78 65 63 28 29 3b d a 7d d a

qCompress(bb)

size: 172

 0 0 0 dd 78 9c 5d 8d cd a c2 30 10 84 cf 6 f2 e 4b 7a 69 8b 56 3c ab

 5 f1 e7 5e bd 29 1e 42 5c da 85 9a 86 34 55 51 7c 77 93 96 5e dc c3 32 33

 7c cc 44 a4 55 dd dd 10 56 85 db 36 16 e7 45 f8 1b 63 6a 52 d2 51 a3 73 ce

 a2 91 11 ed 9b 4c 56 9 ce 38 23 ed e0 2e 49 c7 41 48 5b aa 29 a8 4a 5a 48

 bd 7e 5c ae 9 67 1f ce c0 df 7f 21 c8 78 c0 3 98 2c 39 9b 9c ce 64 52 68

 61 d 1a 9f 10 5c dc e7 ed 2c 6f c ea 3 d5 18 8b 45 e6 b7 c5 98 97 e8 f6

 bb 63 8f d 2b 16 5d 67 7d 77 86 2f 54 7d fe e5 ec 7 12 7 41 27
离线cx_star

只看该作者 1楼 发表于: 2009-09-23
??????
离线channon
只看该作者 2楼 发表于: 2009-10-23
楼上的,可以讨论一下qcompress么?

我的msn是 channon.wang@msn.com
操作系统: Archlinux
Qt SDK: Qt 4.7.1 for Linux
开发方向: Qt,Java
常用数据库:Firebird、SQLite
离线channon
只看该作者 3楼 发表于: 2009-10-23
我的需求是这样的,用java 将String压缩后存为文件。

qt读取该文件,解压后获取QString。

目前通过java压缩/解压缩没问题,通过QT压缩/解压缩也没问题,但是就是不能用qt解压缩java生成的文件内容。

根据qt文档描述:qcompress生成的压缩数据只有quncompress才能解压缩。

那么qcompress根据什么算法压缩数据的呢,如何用java压缩的数据使得quncompress可以解压呢?
操作系统: Archlinux
Qt SDK: Qt 4.7.1 for Linux
开发方向: Qt,Java
常用数据库:Firebird、SQLite
离线cx_star

只看该作者 4楼 发表于: 2009-10-23
引用第3楼channon于2009-10-23 15:44发表的  :
我的需求是这样的,用java 将String压缩后存为文件。
qt读取该文件,解压后获取QString。
目前通过java压缩/解压缩没问题,通过QT压缩/解压缩也没问题,但是就是不能用qt解压缩java生成的文件内容。
.......


算法是 zlib 里面的 deflate,看qt的源代码可以看到。

我没有研究这个问题了。。。。我用了quazip 可以读zip文件里面的东西了。。。
离线channon
只看该作者 5楼 发表于: 2009-10-23
quazip可以读QBuffer里的zip文件么?

因为我通过qhttp将服务器上的文件读到QBuffer里,不想保存在本地。
操作系统: Archlinux
Qt SDK: Qt 4.7.1 for Linux
开发方向: Qt,Java
常用数据库:Firebird、SQLite
离线cx_star

只看该作者 6楼 发表于: 2009-10-23
引用第5楼channon于2009-10-23 16:44发表的  :
quazip可以读QBuffer里的zip文件么?
因为我通过qhttp将服务器上的文件读到QBuffer里,不想保存在本地。


好像不行吧。。。。他的构造函数 只有 一个QString的 filename
离线channon
只看该作者 7楼 发表于: 2009-10-23
恩,这个我看到了。

多谢啊,我看看源码去
操作系统: Archlinux
Qt SDK: Qt 4.7.1 for Linux
开发方向: Qt,Java
常用数据库:Firebird、SQLite
离线channon
只看该作者 8楼 发表于: 2009-10-23
找到一个java类jzlib,可是压缩出来的文件quncompress还是无法解压,愁啊
操作系统: Archlinux
Qt SDK: Qt 4.7.1 for Linux
开发方向: Qt,Java
常用数据库:Firebird、SQLite
离线channon
只看该作者 9楼 发表于: 2009-10-26
找到问题了,是qcompress在压缩数据前加了4byte的头,只要在jzlib压缩后的数据前加上同样的头就可以让quncompress解压了。
操作系统: Archlinux
Qt SDK: Qt 4.7.1 for Linux
开发方向: Qt,Java
常用数据库:Firebird、SQLite
离线蝴蝶君
只看该作者 10楼 发表于: 2011-02-12
楼上的你真的解决了么,&……

我今天跟你一样的问题了………………
离线大猫天蝎

只看该作者 11楼 发表于: 2019-03-25
qcompress 和 quncompress  的确是用的zlib,  

不过他在前面 加了 4个字节的  数据大小..
快速回复
限100 字节
 
上一个 下一个