2012-12-18 235 views
0

我有从使用拉链压缩(RFC1951)Photoshop文件以下数据:DeflateStream压缩/解压缩inconsitency

250, 255, 159, 1, 47, 248, 63, 42, 63, 172, 229, 1, 2, 12, 0, 209, 255, 31, 225 

哪个解以下,X16:

255, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 

重新压缩这给我:

251, 255, 159, 1, 47, 248, 63, 42, 63, 172, 229, 1 

为什么这不是完全一样的原始输入?

(最初发布在CodePlex上,但没有得到回应:http://dotnetzip.codeplex.com/discussions/406943

回答

2

首先,以获得正确的术语,RFC 1951年是deflate格式(其中您的数据),而不是“拉链式压缩”。 zip可以使用deflate,但deflate数据然后用zip包头,预告片和目录包装。其次,一般来说,从来没有任何保证解压缩压缩总是会给你同样的东西。大多数压缩器具有不同的压缩级别和其他选项,可以为相同的输入提供不同的压缩输出。无损压缩机唯一保证的是压缩 - 解压缩会给你同样的东西。

对于您的特定示例,第一台压缩机投掷了一些无关的空白块(其中两个)。那放气流拆解:

static 
literal 255 255 0 
match 29 1 
literal 255 
match 258 32 
match 221 32 
end 
! 
static 
end 
! 
last 
static 
end 

第二压缩机不包括多余的空块:

last 
static 
literal 255 255 0 
match 29 1 
literal 255 
match 258 32 
match 221 32 
end 
+0

非常感谢马克!你用什么来拆解流?如果使用不同的数据得到一致的结果(对于无关块),我只需将它注入到结果流中以便匹配。 –

+1

我使用了'infgen.c',你可以从http://zlib.net/infgen.c.gz下载。 –