zoukankan      html  css  js  c++  java
  • c++ 解包tar

    首先我们来看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 = 0;
    for (int i = 7; i >= 0; i--) {
        
        if (tarHeader->chksum[i] >= 0x30) {
            // 取出相应位上的八进制数
            unsigned int s = tarHeader->chksum[i] - 0x30;       
            
            // 在chksum的八位数据中,最后两位不是有效的八进制数
            // 其它位作相应剩以8的指数
            int j = 7 -  i;
            while(j > 2) {
                s *= 8;
                j--;
            }
             
            // 把每一位八进制的和相加
            chksum += s;
        }
        
        // 然后把每一位都设置为空格
        tarHeader->chksum[i] = 0x20;
    
    } 
    // 计算校验和
    unsigned int sum = 0;
    for (int i = 0; i < 512; i++) {
      sum += header[i];
    }
  • 相关阅读:
    [K/3Cloud] 关于单据转换的问题
    [K/3Cloud] 分录行复制和新增行的冲突如何处理
    [K/3Cloud] 动态表单打开时传递一个自定义参数并在插件中获取
    [译]C++书籍终极推荐
    Time.deltaTime 含义和应用
    cocos2d-x 锚点,位置==》动手实验记录 多动手... :)
    iOS的主要框架介绍
    xcode 预编译头文件
    android 内部存储相关知识点: getfilestreampath getDir 子文件夹
    coco2d-js 多屏适配相关API
  • 原文地址:https://www.cnblogs.com/smallcroco-blog/p/4816337.html
Copyright © 2011-2022 走看看