• 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];
    }
  • 相关阅读:
    C# Bitmap类型与Byte[]类型相互转化
    我所理解的JavaScript闭包
    从零开始编写自己的C#框架 ---- 系列文章
    巧用Windows 7计划任务设置定时提醒
    vba中MsgBox的参数及用法
    SQL行转列和列转行
    web应用程序 ---- 日志系统的设计
    《代码整洁之道》读书笔记
    使用Excel制作万年历(日历可A4纸打印)
    C#窗体全屏功能
  • 原文地址:https://www.cnblogs.com/smallcroco-blog/p/4816337.html
Copyright © 2020-2023  润新知