使用puff.c和deflate .zip

时间:2018-06-14 14:05:37

标签: zip zlib deflate

我有一个STM32的小项目,我通过UART发送文件并将其存储在闪存中的已定义地址。这有效。现在我想修改它并将压缩文件存储在闪存中,并将其解压缩到闪存中其他位置的已定义地址。我使用7zip将文件压缩为.zip类型,使用deflate方法。据我所知,zip文件中的数据位于文件名和额外字段之后。所以我在本地int位(struct state * s,int need)函数中使用了一个偏移值。在抽吸函数开始后,我得到last = 0并且键入= 2看起来没问题。但是在local int dynamic(struct state * s)中的while函数中,我遇到了一个很难的错误。所以我的问题是:

我可以使用带有deflate方法的.zip文件吗?

在额外字段之后开始收缩数据(包括3个块位)是否正确?

此致 托拜厄斯

1 个答案:

答案 0 :(得分:0)

是的,您可以使用zip来创建文件,确保使用deflate压缩方法(zip格式允许其他方法),然后使用puff来解压缩压缩数据。但是,您必须编写一些代码来查找压缩数据的开头,这不一定只是一个简单的偏移量。您需要解码zip文件的第一个条目的本地标头,该文件具有可变长度字段。您可以找到记录here

的zip文件格式

由于您只压缩一个文件,因此使用gzip而不是zip会更简单,结果更小。标题更简单,更易于解码,但仍具有可变长度字段。更好的方法是使用zlib压缩到zlib流,该流具有固定长度的双字节头,用于最紧凑和易于处理的格式。 zlib不是一个实用程序,而是一个压缩和解压缩库,您可以编写自己的代码来进行压缩。

在所有情况下,您都应该使用相应格式(zip,gzip或zlib)中的检查值来检查解压缩数据的完整性。

您也可以选择使用zlib中的inflate而不是puff。 Puff可能最适合您的嵌入式应用程序,因为它在代码大小和解压缩所需的内存方面都很小。但是,如果速度很重要,那么膨胀比粉扑快一点,代价是需要更多的代码和更多的内存。