我似乎无法获得Flex 3想要解压缩的流。
我试过了:
这些似乎都不会使
ByteArray.uncompress
开心,即我得到同样,整个Deflate vs zlib也让我转圈。
根据wikipedia的文章,zlib似乎是DEFLATE的实现。但是根据Actionscript,它们是两个不同的事物吗?
微软似乎也表明Gzip至少使用Deflate算法,因为在他们的文档中,他们提到GZipOutputStream使用与DeflateStream相同的压缩算法。因此,我假设这只是 header 差异,这表明就“ByteArray.uncompress”而言,这是“不好的”,因为仅在AIR应用程序中支持“DEFLATE”算法。
示例“服务器”代码,在这种情况下使用SharpZipLib(不起作用):
public virtual bool ProcessRequest(string path, HttpListenerContext context)
{
var buffer = File.ReadAllBytes(path);
// Specifying to strip header/footer from data as that seems to be what the
// docs for ByteArray.uncompress indicate is necessary
var deflater = new Deflater(Deflater.DEFAULT_COMPRESSION, true);
using (var zipStream = new DeflaterOutputStream(context.Response.OutputStream, deflater))
{
zipStream.Write(buffer, 0, buffer.Length);
}
}
最佳答案
ZLIB和DEFLATE不同。 IETF RFC中定义了一组3个相关的压缩规范:
它们都(主要)使用特定的压缩算法DEFLATE。
ZLIB如何关联到DEFLATE
第一个ZLIB在开头包含成帧字节。根据RFC 1950 ...
A zlib stream has the following structure:
0 1
+---+---+
|CMF|FLG| (more-->)
+---+---+
(if FLG.FDICT set)
0 1 2 3
+---+---+---+---+
| DICTID | (more-->)
+---+---+---+---+
+=====================+---+---+---+---+
|...compressed data...| ADLER32 |
+=====================+---+---+---+---+
CMF和FLG是字节。正如规范所说,ZLIB中使用的主要压缩方法是DEFLATE,尽管该规范可以与其他方法一起使用。通常不是。另外,通常不使用DICTID 。因此,每个ZLIB字节流都有2个字节,然后是压缩数据流,然后是Adler32校验和。压缩的数据是来自DEFLATE的裸露字节流。
GZIP如何关联到DEFLATE
这照顾到ZLIB作为格式与DEFLATE有何不同。 GZIP是第三种格式。如果需要详细信息,请检查RFC。关键是与ZLIB一样,GZIP主要使用DEFLATE,并将 header 放在压缩数据流之前,然后放在校验和之后。但是GZIP header 与ZLIB header 不同,因此任何GZipStream类都将无法编写将被读取为ZLIB的字节流。反之亦然。
解决问题
读取ZLIB流时,在将流推进到前两个ZLIB成帧字节之后,使用.NET的内置DeflateStream对数据流添加some people address the problem you experienced。只要您要读取,ZLIB流就使用DEFLATE(安全假设)并且它没有定义固定的字典(也很安全),并且如果您不关心Adler32提供的完整性检查(也许)。
如果您不喜欢做这些假设或放弃检查,或者您必须生成一个ZLIB数据流,则ZlibStream中有一个DotNetZip,它将为您读取和写入ZLIB数据流,并根据需要验证或产生校验和。
DotNetZip是免费使用的,可与任何.NET语言一起使用。您不需要完整的DotNetZip库,而是只需要Ionic.Zlib.dll。
关于c# - .NET zlib流与Actionscript ByteArray.uncompress兼容,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/1545973/