Zip文件格式
来源:互联网 发布:java se可以开发web吗 编辑:程序博客网 时间:2024/04/28 21:40
标识头
50 4B 01 02 kCentralFileHeader
50 4B 03 04 kLocalFileHeader
50 4B 05 06 kEndOfCentralDir
kEndOfCentralDir:
文件最后位置, cdStartOffset 定位 kCentralFileHeader
struct CEcd{ UInt16 thisDiskNumber; UInt16 startCDDiskNumber; UInt16 numEntriesInCDOnThisDisk; UInt16 numEntriesInCD; UInt32 cdSize; UInt32 cdStartOffset; UInt16 commentSize; void Parse(const Byte *p);};void CEcd::Parse(const Byte *p){ thisDiskNumber = Get16(p); startCDDiskNumber = Get16(p + 2); numEntriesInCDOnThisDisk = Get16(p + 4); numEntriesInCD = Get16(p + 6); cdSize = Get32(p + 8); cdStartOffset = Get32(p + 12); commentSize = Get16(p + 16);}
kCentralFileHeader:
集中数据 压缩包内项目, LocalHeaderPosition 为实际数据偏移 kLocalFileHeader
<span style="font-family: Arial, Helvetica, sans-serif;">HRESULT CInArchive::ReadCdItem(CItemEx &item)</span>
{ item.FromCentral = true; const int kBufSize = 42; Byte p[kBufSize]; SafeReadBytes(p, kBufSize); item.MadeByVersion.Version = p[0]; item.MadeByVersion.HostOS = p[1]; item.ExtractVersion.Version = p[2]; item.ExtractVersion.HostOS = p[3]; item.Flags = Get16(p + 4); item.CompressionMethod = Get16(p + 6); item.Time = Get32(p + 8); item.FileCRC = Get32(p + 12); item.PackSize = Get32(p + 16); item.UnPackSize = Get32(p + 20); UInt16 headerNameSize = Get16(p + 24); UInt16 headerExtraSize = Get16(p + 26); UInt16 headerCommentSize = Get16(p + 28); UInt32 headerDiskNumberStart = Get16(p + 30); item.InternalAttributes = Get16(p + 32); item.ExternalAttributes = Get32(p + 34); item.LocalHeaderPosition = Get32(p + 38); ReadFileName(headerNameSize, item.Name); if (headerExtraSize > 0) { ReadExtra(headerExtraSize, item.CentralExtra, item.UnPackSize, item.PackSize, item.LocalHeaderPosition, headerDiskNumberStart); } if (headerDiskNumberStart != 0) throw CInArchiveException(CInArchiveException::kMultiVolumeArchiveAreNotSupported); // May be these strings must be deleted /* if (item.IsDir()) item.UnPackSize = 0; */ ReadBuffer(item.Comment, headerCommentSize); return S_OK;}
kLocalFileHeader
数据后面紧跟项目压缩后的数据
HRESULT CInArchive::ReadLocalItem(CItemEx &item){ const int kBufSize = 26; Byte p[kBufSize]; SafeReadBytes(p, kBufSize); item.ExtractVersion.Version = p[0]; item.ExtractVersion.HostOS = p[1]; item.Flags = Get16(p + 2); item.CompressionMethod = Get16(p + 4); item.Time = Get32(p + 6); item.FileCRC = Get32(p + 10); item.PackSize = Get32(p + 14); item.UnPackSize = Get32(p + 18); UInt32 fileNameSize = Get16(p + 22); item.LocalExtraSize = Get16(p + 24); ReadFileName(fileNameSize, item.Name); item.FileHeaderWithNameSize = 4 + NFileHeader::kLocalBlockSize + fileNameSize; if (item.LocalExtraSize > 0) { UInt64 localHeaderOffset = 0; UInt32 diskStartNumber = 0; ReadExtra(item.LocalExtraSize, item.LocalExtra, item.UnPackSize, item.PackSize, localHeaderOffset, diskStartNumber); } /* if (item.IsDir()) item.UnPackSize = 0; // check It */ return S_OK;}
0 0
- zip文件格式
- ZIP文件格式
- zip文件格式
- Zip文件格式
- zip文件格式
- zip文件格式
- python与zip文件格式
- 【文档】Zip文件格式
- ZIP文件格式详解
- ZIP文件格式详解
- ZIP文件格式详解
- zip 文件格式说明书
- zip、rar文件格式
- zip文件格式分析
- zip文件格式说明
- zip文件格式解析
- ZIP文件格式分析
- ZIP文件格式组成
- Kafka的架构设计
- UltraEdit 保存后产生bak文件
- 若干排序算法简单汇总(二)
- 存储过程
- android特效---笔记
- Zip文件格式
- JAX-RS入门 二 :运行
- SIM卡文件表
- QT在VS2010下环境的搭建
- 若干排序算法简单汇总(一)
- 系统主站如何访问GPRS/CDMA网络中的模块
- Toast五种特效
- 用Python和Pygame写游戏-从入门到精通(1)
- struts2 autocompleter标签 动态下拉菜单