⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 cabheader.h

📁 7-Zip 3.11的源码
💻 H
字号:
// Archive/Cab/Header.h

#pragma once

#ifndef __ARCHIVE_CAB_HEADER_H
#define __ARCHIVE_CAB_HEADER_H

#include "Common/Types.h"

#pragma pack(push, PragmaCabHeaders)
#pragma pack(push, 1)

namespace NArchive {
namespace NCab {
namespace NHeader{

namespace NArchive {
  
  extern UINT32 kSignature;
  
  namespace NFlags
  {
    const int kPrevCabinet = 0x0001;
    const int kNextCabinet = 0x0002;
    const int kReservePresent = 0x0004;
  }

  struct CBlock
  {
    UINT32  Signature;	/* cabinet file signature */
    UINT32  Reserved1;	/* reserved */
    UINT32  Size;	/* size of this cabinet file in bytes */
    UINT32  Reserved2;	/* reserved */
    UINT32  FileOffset;	/* offset of the first CFFILE entry */
    UINT32  Reserved3;	/* reserved */
    BYTE  VersionMinor;	/* cabinet file format version, minor */
    BYTE  VersionMajor;	/* cabinet file format version, major */
    UINT16  NumFolders;	/* number of CFFOLDER entries in this cabinet */
    UINT16  NumFiles;	/* number of CFFILE entries in this cabinet */
    UINT16  Flags;	/* cabinet file option indicators */
    UINT16  SetID;	/* must be the same for all cabinets in a set */
    UINT16  CabinetNumber;	/* number of this cabinet file in a set */
  };

  struct CPerDataSizes
  {
    UINT16  PerCabinetAreaSize; 	/* (optional) size of per-cabinet reserved area */
    BYTE  PerFolderAreaSize; 	/* (optional) size of per-folder reserved area */
    BYTE  PerDatablockAreaSize; 	/* (optional) size of per-datablock reserved area */
  };

    /*
    BYTE  abReserve[];	// (optional) per-cabinet reserved area
    BYTE  szCabinetPrev[];	// (optional) name of previous cabinet file
    BYTE  szDiskPrev[];	// (optional) name of previous disk
    BYTE  szCabinetNext[];	// (optional) name of next cabinet file
    BYTE  szDiskNext[];	// (optional) name of next disk
    */
}

namespace NCompressionMethodMajor
{
  const BYTE kNone = 0;
  const BYTE kMSZip = 1;
  const BYTE kQuantum = 2;
  const BYTE kLZX = 3;
}

struct CFolder
{
  UINT32  DataStart;	// offset of the first CFDATA block in this folder
  UINT16  NumDataBlocks;	// number of CFDATA blocks in this folder
  BYTE CompressionTypeMajor;
  BYTE CompressionTypeMinor;
  // BYTE  abReserve[];	// (optional) per-folder reserved area
  BYTE GetCompressionMethod() const { return CompressionTypeMajor & 0xF; }
};

const int kFileNameIsUTFAttributeMask = 0x80;

namespace NFolderIndex
{
  const int kContinuedFromPrev    = 0xFFFD;
  const int kContinuedToNext      = 0xFFFE;
  const int kContinuedPrevAndNext = 0xFFFF;
  inline UINT16 GetRealFolderIndex(UINT16 aNumFolders, UINT16 aFolderIndex)
  {
    switch(aFolderIndex)
    {
      case kContinuedFromPrev:
        return 0;
      case kContinuedToNext:
      case kContinuedPrevAndNext:
        return aNumFolders - 1;
      default:
        return aFolderIndex;
    }
  }
}

struct CFile
{
  UINT32  UnPackSize;	/* uncompressed size of this file in bytes */
  UINT32  UnPackOffset;	/* uncompressed offset of this file in the folder */
  UINT16  FolderIndex;	/* index into the CFFOLDER area */
  UINT16  PureDate;
  UINT16  PureTime;	/* Time */
  UINT16  Attributes;	/* attribute flags for this file */
  //BYTE  szName[];	/* name of this file */
};

}}}

#pragma pack(pop)
#pragma pack(pop, PragmaCabHeaders)

#endif

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -