我有这段代码,它用Python中的zlib
(gzip
)压缩数据
dta = bytes(str("..."))
res = zlib.compress(dta)
with open('packed.gz', 'wb') as f:
f.write(t)
我想把它锈开
use std::io::prelude::*;
use flate2::read::GzDecoder; // flate2 = "1.0"
use std::fs::File;
fn main() {
let f = File::open("packed.gz").unwrap();
let mut d = GzDecoder::new(f);
let mut s = String::new();
d.read_to_string(&mut s).unwrap();
println!("{}", s);
}
我得到
thread 'main' panicked at 'called `Result::unwrap()` on an `Err` value: Custom { kind: InvalidInput, error: "invalid gzip header" }', src/main.rs:11:30
文件格式的差异是否有问题
确实
zlib
压缩是gzip兼容的,正如python stdlib documentation所提到的。这是因为zlib和gzip都使用deflate
压缩标准zlib
生成原始的deflate压缩字节流。另一方面gzip
是单次压缩的标准,它将压缩流包裹在放气上。因此,如果从gzip文件中去掉文件头,可以使用原始deflate库进行解压缩字符串
This is the raw string
的zlib
压缩流如下所示这是(当您将其发送到
xxd
时)前2个字节声明文件的类型
在我们的例子中,它是
78 9C
,它是zlib,带有默认压缩,这是python在其文档中所说的它应该是
zlib compressed data
,因为这就是文件头的样子如果我们尝试使用gzip进行压缩,让我们看看会出现什么
如果你注意到十六进制转储
神奇的数字显示为:
1f 8b
(wiki)。如果您查看头部,您将看到两个十六进制转储包含相同的压缩数据,这是 对于zlib还有,对于gzip
因此,如果你ask rust to use the correct decoder,它肯定会起作用。这就是标准的好处
因此,gzip只是zlib容器上的一个容器,我没有解释hextump中其他字节的含义(因为我还没有查找它)
python程序生成的数据流实际上不是
.gz
文件,而是原始的DEFLATE流。如果需要.gz
文件(包括flate2::read::GzDecoder
需要的gz头),请使用Python中的gzip
模块。如果确实需要原始的DEFLATE流(由zlib.compress
生成),请使用flate2::read::DeflateDecoder
解压缩数据结果是
flate2
中有ZlibDecoder
。。。它是有效的相关问题 更多 >
编程相关推荐