TAR 文件结构 详解

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压缩,也是默认的压缩格式。除非你明确知道它的压缩算法。


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

博主🐧2700433330

卫星🛰LanJiaMing0226

擅长文本、图片处理,如果你的代码执行效率低下,可以喊博主代劳优化哦🙂😊

  • 23
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值