Chinaunix首页 | 论坛 | 博客
  • 博客访问: 5771492
  • 博文数量: 675
  • 博客积分: 20301
  • 博客等级: 上将
  • 技术积分: 7671
  • 用 户 组: 普通用户
  • 注册时间: 2005-12-31 16:15
文章分类

全部博文(675)

文章存档

2012年(1)

2011年(20)

2010年(14)

2009年(63)

2008年(118)

2007年(141)

2006年(318)

分类: C/C++

2008-01-04 13:47:16

今天帮一个同事找tar文件的判断方法,顺便分析一下tar文件的格式。tar只是一个归档文件,并不进行压缩。

  struct tar_header
  {
   char name[100];
   char mode[8];
   char uid[8];
   char gid[8];
   char size[12];
   char mtime[12];
   char chksum[8];
   char typeflag;
   char linkname[100];
   char magic[6];
   char version[2];
   char uname[32];
   char gname[32];
   char devmajor[8];
   char devminor[8];
   char prefix[155];
   char padding[12];
  };
  
  以上是Tar中保存文件信息的数据结构,其后跟着的就是文件的内容。
   size为文件大小的八进制字节表示,例如文件大小为90个字节,那么这里就是八进制的90,即为132。
  其中,文件大小,修改时间,checksum都是存储的对应的八进制字符串,字符串最后一个字符为空格字符
  checksum的计算方法为出去checksum字段其他所有的512-8共504个字节的ascii码相加的值再加上256(checksum当作八个空格,即8*0x20)
  文件内容以512字节为一个block进行分割,最后一个block不足部分以0补齐
  两个文件的tar包首先存放第一个文件的tar头结构,然后存储文件内容,接着存储第二个文件的tar头结构,然后存储文件内容
  所有文件都存储完了以后,最后存放一个全零的tar结构
  所有的tar文件大小应该都是512的倍数,一个空文件打包后为512*3字节,包括一个tar结构头,一个全零的block存储文件内容,一个全零的tar结构

检测tar文件格式的方法:
1、检测magic字段,即在0x101处检查字符串,是否为ustar。有时某些压缩软件将这个字段设置为空。如果magic字段为空,进入第2步。
2、计算校验和,按照上面的方法计算校验和,如果校验和正确的话,那么这就是一个tar文件。

注意:在windows下面,不支持uid、uname等,有的甚至不支持magic,这样就比较麻烦了。
  
详细的可以参考:
阅读(14341) | 评论(4) | 转发(1) |
给主人留下些什么吧!~~

chinaunix网友2010-12-08 16:28:02

没说清楚,是is_tar.c文件中的is_tar函数

chinaunix网友2010-12-08 16:28:02

没说清楚,是is_tar.c文件中的is_tar函数

chinaunix网友2010-12-08 16:26:51

以前查看tar文件格式的时候,搜索到您的这篇文章,感觉讲tar格式的中文资料确实较少 今天无意间在file的源代码中,看到了tar格式的判断方法,与您的说法是一致的,哈哈~ 具体位置是file-4.17\file-4.17\src\is_tar.c /* * Return * 0 if the checksum is bad (i.e., probably not a tar archive), * 1 for old UNIX tar file, * 2 for Unix Std (POSIX) tar file. */ private int is_tar(const unsigned char *buf, size_t nbytes)

chinaunix网友2010-12-08 16:26:51

以前查看tar文件格式的时候,搜索到您的这篇文章,感觉讲tar格式的中文资料确实较少 今天无意间在file的源代码中,看到了tar格式的判断方法,与您的说法是一致的,哈哈~ 具体位置是file-4.17\file-4.17\src\is_tar.c /* * Return * 0 if the checksum is bad (i.e., probably not a tar archive), * 1 for old UNIX tar file, * 2 for Unix Std (POSIX) tar file. */ private int is_tar(const unsigned char *buf, size_t nbytes)