首先我们来看tar文件组成

tar中的数据都是以512字节为单位;tar由三部分组成 “头部+内容+尾部”,其中头部是512字节的头部结构,内容是存放一个文件内容的地方,最后尾部是一个512字节的全零标志。

这里给出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中保存文件信息的数据结构,其后跟着的就是文件的内容。

其中,文件大小,修改时间,checksum都是存储的对应的八进制字符串,字符串最后一个字符为空格字符

checksum的计算方法为出去checksum字段其他所有的512-8共504个字节的ascii码相加的值再加上256(checksum当作八个空格,即8*0x20)

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

这里给出计算校验和的方法// 先取出检验值

unsigned int chksum = ;
for (int i = ; i >= ; i--) { if (tarHeader->chksum[i] >= 0x30) {
// 取出相应位上的八进制数
unsigned int s = tarHeader->chksum[i] - 0x30; // 在chksum的八位数据中,最后两位不是有效的八进制数
// 其它位作相应剩以8的指数
int j = - i;
while(j > ) {
s *= ;
j--;
} // 把每一位八进制的和相加
chksum += s;
} // 然后把每一位都设置为空格
tarHeader->chksum[i] = 0x20; }
// 计算校验和
unsigned int sum = 0;
for (int i = 0; i < 512; i++) {
  sum += header[i];
}

最新文章

  1. POJ 1066 Treasure Hunt (线段相交)
  2. iOS 访问粘贴板
  3. 【BZOJ】3038: 上帝造题的七分钟2(线段树+暴力)
  4. [HTML]background-size可以缩放大小
  5. Photoshop CS6的安装
  6. SQL-学习使用FOR XML PATH
  7. Avoiding “will create implicit index” NOTICE
  8. StrutsPrepareAndExecuteFilter(转)
  9. U3D游戏开发基础
  10. CentOS6.8 安装配置Mysql
  11. inventory file 与hosts patterns (ansible 机器清单 与 主机匹配模式)
  12. java 环形链表实现约瑟夫(Joseph)问题
  13. vs2012碰到生成时报该错误:项目中不存在目标“GatherAllFilesToPublish”
  14. HTTP/1.1 100 Continue - I 服了 You
  15. 2018.11.05 bzoj3124: [Sdoi2013]直径(树形dp)
  16. java 枚举 封装操作方法
  17. 一分钟掌握Android spinner下拉框
  18. Android Bitmap
  19. 微服务深入浅出(6)-- 熔断器Hystrix
  20. shell脚本中${var1:-var2}

热门文章

  1. 2016中国大学生程序设计竞赛 网络选拔赛 I This world need more Zhu
  2. div可编辑状态设置
  3. springboot+dubbo之多端口注入服务
  4. uva116
  5. 修改ie的默认值 为ie10
  6. IOS网络第二天 - 04-黑酷-GDataXML 解析
  7. Apache配置过程
  8. hihoCoder 1185 连通性&#183;三(Tarjan缩点+暴力DFS)
  9. POJ 3177 Redundant Paths(边双连通的构造)
  10. Linux Vim编辑器使用简单讲解