当前位置:网站首页 > R语言数据分析 > 正文

zipsigner签名教程(zipsigner签名代码)



太长不看?直接用 zip-saver
一、zip 文件格式简介

zip 文件大致可以分成三个个部分:

  1. 文件部分
    • 文件部分包含了所有的文件内容,每个文件都有一个文件头,文件头包含了文件的元信息,比如文件名、文件大小、文件的压缩方式等等。
  2. 中央目录部分
    • 中央目录部分包含了所有文件的元信息,比如文件名、文件大小、文件的压缩方式等等。
  3. 目录结束标识 - 目录结束标识标识了中央目录部分的结束。包含了中央目录的开始位置、中央目录的大小等信息。 图片来自:en.wikipedia.org/wiki/ZIP_(f…

对于每一个文件,他在 zip 中包含三部分

  1. 本地文件头( Local File Header)-- 图片来自:goodapple.top/archives/70…
  1. 文件内容
  2. 数据描述符( Data descriptor)-- 图片来自:goodapple.top/archives/70…

数据描述符是可选的,当本地文件头中没有指明 CRC-32 校验码和压缩前后的长度时,才需要数据描述符

中央目录区的数据构成是这样的 -- 图片来自:goodapple.top/archives/70…

目录结束标识的数据构成是这样的 -- 图片来自:goodapple.top/archives/70…

二、代码实现

有了上面的信息之后,不难想到生成一个 zip 文件的步骤:

  1. 生成文件部分
    1. 构造固定的文件信息头
    2. 追加文件内容
    3. 计算文件的 CRC32 校验码
    4. 生成数据描述符
  2. 生成中央目录部分
    1. 构造固定的中央文件信息头
    2. 计算文件的偏移量
  3. 生成目录结束标识
    1. 构造固定的目录结束标识
    2. 计算中央目录的大小和偏移
1. 生成本地文件头(local file header)

根据的结构,我们很容易得知:一个 的大小是 个字节

其中是文件名的长度,是扩展字段的长度,在这里我们不考虑扩展字段,那么最终大小就是

在中我可以直接用来存储一个字节,又因为 zip 是采用小端序,为了方便操作, 那么变量就可以这样定义:

 
  

js

代码解读

复制代码

定义完 local file header 变量后我们就可以往里面塞一些东西了

 
  

js

代码解读

复制代码

到此,一个就生成好了

2. 文件内容追加

文件内容追加这一步很简单,这里我们不考虑压缩文件,直接将文件转为 并计算文件的 CRC32 校验码,然后追加到后面即可

 
  

js

代码解读

复制代码

3. 数据描述符(Data descriptor)生成

数据描述符用来表示文件压缩与的结束,根据他的编码格式,他包含的信息只有四个:固定的标识符、CRC-32校验码,压缩前的大小,压缩后的大小,这里我们暂且不考虑数据的压缩, 要生成他也很简单:

 
  

js

代码解读

复制代码

至此,一个文件在zip中所有的信息就已经都可以生成了,接下来就需要生成中央目录信息了

4. 中央目录区生成

根据上面的图,我们知道, 中央目录区也是由一个一个的文件头组成,每一个文件头对对应着一个真实文件的信息,每个文件信息大小是46 + n + m + k,其中n是文件名称的大小,m是扩展字段的大小,k是文件注释的大小。 在这里,我们可以暂时不必管扩展字段,先计算一下中央目录区的总大小:

 
  

js

代码解读

复制代码

然后,创建一个变量存储中央目录区的数据

 
  

js

代码解读

复制代码

接下来就可以通过循环,将所有文件的信息都写入中央目录区

 
  

js

代码解读

复制代码

最后,再生成 目录结束标识

 
  

js

代码解读

复制代码

5. 拼接完整数据

完成了上面所有的步骤之后,我们只需要把数据都拼接起来就可以了

 
  

js

代码解读

复制代码

ok,搞定!

6. 完整的实现

github.com/EatherToo/z…

三、总结

经过上面的步骤,我们就可以生成一个zip文件了,当然,这里只是一个简单的实现,zip文件格式还有很多细节,比如压缩算法、加密压缩等等,这里都没有涉及到,后面有时间再来完善吧。

参考资料:

  • goodapple.top/archives/70…
  • en.wikipedia.org/wiki/ZIP_(f…
  • github.com/jimmywartin…

到此这篇zipsigner签名教程(zipsigner签名代码)的文章就介绍到这了,更多相关内容请继续浏览下面的相关推荐文章,希望大家都能在编程的领域有一番成就!

版权声明


相关文章:

  • treehut官网(treehouse官网)2025-08-27 14:00:08
  • resnet一作(resnet top1)2025-08-27 14:00:08
  • redis-cli连接(redis-cli连接多个redis)2025-08-27 14:00:08
  • pass around服务(service bypass)2025-08-27 14:00:08
  • spark 面试题(spark面试题面试题)2025-08-27 14:00:08
  • hrnetone深圳(one more深圳)2025-08-27 14:00:08
  • nrm不是内部或外部命令(rm 不是内部或外部命令,也不是可运行的程序)2025-08-27 14:00:08
  • rmsprop算法怎么读(priorelem算法)2025-08-27 14:00:08
  • sem_wait返回值(wait_event_interruptible返回值)2025-08-27 14:00:08
  • awvs是什么工具(awork是什么)2025-08-27 14:00:08
  • 全屏图片