c++ 解包tar
2015-09-17 14:33
183 查看
首先我们来看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文件。
这里给出计算校验和的方法// 先取出检验值
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语言数组指针定义方法
- C++模板编程里的主版本模板类、全特化、偏特化(C++ Type Traits)
- vc++导入com组件
- Effective C++——尽可能使用const
- C++中将整型数与字符串型之间的类型转换
- c++ Primer 第1~4章部分摘写。
- C++类型转换
- c++中的string常用函数用法总结
- c语言中.h文件的作用
- 话说C语言const用法
- C++ 头文件cstring,string.h,string 三者的区别
- 算法学习--快速排序
- C语言的一些习题
- MFC获取本机IP地址
- c++primer plus 2.7编程练习作业
- C语言生成带序号的文件名
- C/C++__基础类型的(=)赋值表达式的返回值
- C语言printf函数
- C++ 联合体共享变量值的计算
- 常见C++内存池技术