开启辅助访问 切换到宽版

精易论坛

 找回密码
 注册

QQ登录

只需一步,快速开始

用微信号发送消息登录论坛

新人指南 邀请好友注册 - 我关注人的新帖 教你赚取精币 - 每日签到


求职/招聘- 论坛接单- 开发者大厅

论坛版规 总版规 - 建议/投诉 - 应聘版主 - 精华帖总集 积分说明 - 禁言标准 - 有奖举报

查看: 175|回复: 0
收起左侧

[技术专题] TAR 文件结构 详解

[复制链接]

结帖率:100% (53/53)
发表于 2024-4-20 22:38:04 | 显示全部楼层 |阅读模式   福建省宁德市
Tar是Unix平台下非常流行的打包格式,该格式不负责压缩,只负责打包。简而言之,Tar就是将各个文件和文件夹,简单的组合成一个文件,使之可以按照标准还原成原来的多个文件。

Windows平台上使用的主要还是以ZIP、RAR、7z居多,不过难免部分应用程序会用到TAR文件,在此分享我所了解到的TAR文件结构,供后续同学参考,本文仅分享论文,不提供具体编程代码。

一、TAR 文件结构
TAR文件结构可以归类为两个大数据块,分别是:文件元数据标头文件源数据

如下示例:
文件元数据标头
文件源数据
文件元数据标头
文件源数据
重复......



1.文件元数据标头块
文件元数据标头块,该块大小为512(字节),共有16个字段如下:

字段1:name[100]
储存文件路径如(UTF-8编码):
var\path\
var\path\filename.txt
由于name字段限制了只能储存100个字符,如果文件路径超过100字符,则字段:prefix[155] 储存文件路径的前部分name字段储存后部分,共可储存255个字符;这是大多数TAR库的做法。
有的TAR库则是对长文件路径单独起一个文件元数据标头块bandizip做法:
文件元数据标头储存:././@LongLink
文件数据块储存:具体的文件路径
不同版本或者开发者编写的标准可能不一样,解析的时候增加了很多分支判断,不过标准的做法还是在prefix、name字段储存完整的文件路径。
当name信息不足100个字符时,剩余字符需要用NUL\0来填充

字段2:mode[8]
储存文件权限,比如:读、写、删等。

可用:GetFileSecurity() 函数获得文件或目录的具体权限,最终获得权限需要转换为8进制字符串,如:755,不足8为,前面补0,最终:0000755NUL。解释:所有字符串,在末尾都要补NUL作为终止符,论文中所有的字段如:mode[8]是包含终止符NUL在内的,所以是:0000+755+NUL,共8个字符,后续字段说明就不在重复解释了



字段3:uid[8]
用户ID,可选。储存为8进制字符串,不足8位前面补0。Windows上没有uid,所以填充为0000000+NUL



字段4:gid[8]
组ID,可选。与uid一样



字段5:size[12]
文件大小。
如果是目录,则填充11个0:00000000000+NUL
如果是文件,则取出文件的字节大小,假如文件大小为:1024b,转换到8进制字符串为:2000。不足则前面补0:00000002000+NUL



字段6:mtime[12]
文件最后修改时间,10位时间戳转8进制字符串,如:1713616374 > 14610732766,不足长度补零。注:时间是UTC时间,中国就是北京时间-8小时=UTC时间



字段7:chksum[8]
文件元数据标头校验值,用于校验数据的完整性,一般打包的时候计算好储存上,解包的时候来校验,不过几乎所有解包软件不会去校验这个,解包过程只专注于文件的元数据解压还原,也就是将文件名、修改时间、文件权限、文件数据解压还原就好了。

校验算法过程:
文件元数据标头共有16个字段,总大小为512个字节,除去chksum字段,其它所有字段循环读取每一个字节相加的值,转换8进制字符串,不足长度补零。



字段8:typeflag[1]
文件类型
0=普通文件(什么txt、exe、png、lnk(快捷方式)都算普通文件)
1=硬链接;2=软链接;3=字符设备;4=块设备;
5=目录;
6=FIFO(命名管道)
7=保留;N=其它自定义含义
在Windows上,99%就是普通文件、目录;其它你不认识的都按普通文件设置就OK了



字段9:linkname[100]
链接名,可选。Windows上没有,主要是Unix上的



字段10:magic[6]
TAR数据标识字段,可选。不需要填00000+NUL,否则填写:ustar+NUL,表示是TAR文件数据



字段11:version[2]
用于表示TAR文件结构的版本号,以便第三方TAR库参考解析,可选。不过大多数是不填写用NUL填充,也是8进制字符串。


字段12:uname[32]
计算机用户名如(UTF-8编码):Administrator,可选。一般不填,因为不同操作系统的计算机用户名可能不同,一般将tar文件用作备份还原文件的归属权时才会用到。



字段13:gname[32]
用户组的组名,可选。它存储的是文件所有者所属的用户组的组名。在Unix和Linux中,用户不仅可以属于个人,还可以属于一个或多个用户组。用户组通常用于管理文件和目录的访问权限。gname字段就是用来记录文件所有者所属的用户组的组名的



字段14:devmajor[8]
主设备号,可选,通常表示特殊文件(设备文件)的设备号。



字段15:devminor[8]
次设备号,可选。



字段16:prefix[155]
文件路径前缀(UTF-8编码),逻辑选择。当文件路径超过100个字符,name字段无法完全容纳时才会用到,将文件路径前部分储存在该字段中,后部分储存在name字段中,这样就可以表示完整的路径了。
为啥会有这么怪异的设计结构,我想应该是早期设计TAR文件结构时只是用于简单文件打包组合,后来时代发展不够用了,也为了兼容,所以才变化成这样。按照现在的设计完全可以直接将name字段定义为255甚至更大,用于直接储存长文件路径哈哈!



最终生成文件元数据标头示例:
dir1\dir2\NUL...100-10=90个NUL0000755NUL0000000NUL00000002000NUL14610732766NUL0xxxxxxNUL0100个linknameNULustarNULNULNUL32个unameNUL32个gnameNUL8个devmajorNUL8个devminorNUL155个prefixNUL




2.文件源数据块
文件源数据块超简单,不以任何编码转义的文件源数据,直接追加储存在文件元数据标头块后面,文件源数据块,每块大小为512字节,不足的用NUL填充,保证每个块是512对齐

最终生成完整的tar文件结构示例:
dir1\dir2\NUL...100-10=90个NUL0000755NUL0000000NUL00000002000NUL14610732766NUL0xxxxxxNUL0100个linknameNULustarNULNULNUL32个unameNUL32个gnameNUL8个devmajorNUL8个devminorNUL155个prefixNUL文件源数据



有多少个文件、目录,就重复上面的步骤依次追加

文件元数据标头
文件源数据
文件元数据标头
文件源数据
重复......

二、TAR 文件常用解压缩说明
上面只是讲解了TAR文件的结构,从中可以看出TAR文件的结构存在非常多的NUL字符填充,造成了TAR文件的体积非常大,所以一般会给TAR包进行二次压缩,目前常用的TAR包压缩格式有3种。

1.gzip
gzip是最常用的压缩算法之一,它使用LZ77算法和Huffman编码进行压缩。
生成的压缩文件通常以.tar.gz或.tgz为扩展名。

当我们遇到.tar.gz或.tgz,就表示它是一个gzip压缩过的tar文件
解压时需要先进行gzip解压出tar文件,然后再进行tar解析。



2.bzip2
bzip2提供了比gzip更高的压缩率,但压缩和解压速度相对较慢。
生成的压缩文件通常以.tar.bz2为扩展名。

解压时顺序bzip2 > tar



3.xz
xz算法提供了比gzip和bzip2更高的压缩率,同时解压速度也相对较快。

生成的压缩文件通常以.tar.xz为扩展名。



4.注意事项
遇到tar文件时,有些第三方解压缩软件不会给tar命名具体的压缩算法,其后缀直接为.tar,通常解压缩第一步先判断tar文件的大小,如果是512的倍数,那么它可能是未压缩过的tar文件,此时再打开文件,按照512字节为一块,根据tar文件结构判断是否是tar数据结构。

目前的不成文打包标准就是用的gzip压缩,也是默认的压缩格式。除非你明确知道它的压缩算法。



*****************************************************************************

博主

评分

参与人数 1好评 +1 精币 +20 收起 理由
福仔 + 1 + 20 YYDS~!

查看全部评分


您需要登录后才可以回帖 登录 | 注册

本版积分规则 致发广告者

发布主题 收藏帖子 返回列表

sitemap| 易语言源码| 易语言教程| 易语言论坛| 诚聘英才| 易语言模块| 手机版| 广告投放| 精易论坛
拒绝任何人以任何形式在本论坛发表与中华人民共和国法律相抵触的言论,本站内容均为会员发表,并不代表精易立场!
论坛帖子内容仅用于技术交流学习和研究的目的,严禁用于非法目的,否则造成一切后果自负!如帖子内容侵害到你的权益,请联系我们!
防范网络诈骗,远离网络犯罪 违法和不良信息举报电话0663-3422125,QQ: 800073686,邮箱:800073686@b.qq.com
Powered by Discuz! X3.4 揭阳市揭东区精易科技有限公司 ( 粤ICP备12094385号-1) 粤公网安备 44522102000125 增值电信业务经营许可证 粤B2-20192173

快速回复 返回顶部 返回列表