add Zip format Define.h
This commit is contained in:
@@ -0,0 +1,161 @@
|
|||||||
|
#pragma once
|
||||||
|
|
||||||
|
#include <cstdint>
|
||||||
|
|
||||||
|
/** Overall .ZIP file format:
|
||||||
|
|
||||||
|
[local file header 1] -> "PK" + 0x4b50 + ...
|
||||||
|
[encryption header 1]
|
||||||
|
[file data 1]
|
||||||
|
[data descriptor 1]
|
||||||
|
.
|
||||||
|
.
|
||||||
|
.
|
||||||
|
[local file header n] -> "PK" + 0x4b50 + ...
|
||||||
|
[encryption header n]
|
||||||
|
[file data n]
|
||||||
|
[data descriptor n]
|
||||||
|
[archive decryption header]
|
||||||
|
[archive extra data record]
|
||||||
|
[central directory header 1]
|
||||||
|
.
|
||||||
|
.
|
||||||
|
.
|
||||||
|
[central directory header n] -> "PK" + 0x4b50
|
||||||
|
[zip64 end of central directory record]
|
||||||
|
[zip64 end of central directory locator]
|
||||||
|
[end of central directory record] <- 필수 포함 (단 한개)
|
||||||
|
*/
|
||||||
|
|
||||||
|
/** Local file header:
|
||||||
|
|
||||||
|
local file header signature 4 bytes (0x04034b50)
|
||||||
|
version needed to extract 2 bytes
|
||||||
|
general purpose bit flag 2 bytes
|
||||||
|
compression method 2 bytes
|
||||||
|
last mod file time 2 bytes
|
||||||
|
last mod file date 2 bytes
|
||||||
|
crc-32 4 bytes
|
||||||
|
compressed size 4 bytes
|
||||||
|
uncompressed size 4 bytes
|
||||||
|
file name length 2 bytes -> Variable
|
||||||
|
extra field length 2 bytes -> Variable
|
||||||
|
|
||||||
|
file name (variable size)
|
||||||
|
extra field (variable size)
|
||||||
|
*/
|
||||||
|
|
||||||
|
#pragma pack(push, 1)
|
||||||
|
constexpr int LOCAL_FILE_HEADER_BYTE = 30;
|
||||||
|
|
||||||
|
struct LocalFileHeader {
|
||||||
|
uint32_t signature;
|
||||||
|
uint16_t versionNeededToExtract;
|
||||||
|
uint16_t generalBitFlag;
|
||||||
|
uint16_t compressionMethod; // no compression == 0
|
||||||
|
uint16_t lastModTime; // 압축 시점의 시간 (1980년 기준 시간)
|
||||||
|
uint16_t lastModDate; // 압축 시점의 날짜 (1980년 기준 연도)
|
||||||
|
uint32_t crc32;
|
||||||
|
uint32_t compressedSize; // same as unCompression (cuz no compreesion)
|
||||||
|
uint32_t unCompressedSize;
|
||||||
|
uint16_t fileNameLength;
|
||||||
|
uint16_t extraFieldLength;
|
||||||
|
|
||||||
|
// var[fileNameLength] fileName
|
||||||
|
// var[extraFieldLength] extraField
|
||||||
|
};
|
||||||
|
|
||||||
|
/** Central directory structure:
|
||||||
|
|
||||||
|
[central directory header 1]
|
||||||
|
.
|
||||||
|
.
|
||||||
|
.
|
||||||
|
[central directory header n]
|
||||||
|
[digital signature]
|
||||||
|
|
||||||
|
File header:
|
||||||
|
|
||||||
|
central file header signature 4 bytes (0x02014b50)
|
||||||
|
version made by 2 bytes
|
||||||
|
version needed to extract 2 bytes
|
||||||
|
general purpose bit flag 2 bytes
|
||||||
|
compression method 2 bytes
|
||||||
|
last mod file time 2 bytes
|
||||||
|
last mod file date 2 bytes
|
||||||
|
crc-32 4 bytes
|
||||||
|
compressed size 4 bytes
|
||||||
|
uncompressed size 4 bytes
|
||||||
|
file name length 2 bytes
|
||||||
|
extra field length 2 bytes
|
||||||
|
file comment length 2 bytes
|
||||||
|
disk number start 2 bytes
|
||||||
|
internal file attributes 2 bytes
|
||||||
|
external file attributes 4 bytes
|
||||||
|
relative offset of local header 4 bytes
|
||||||
|
|
||||||
|
file name (variable size)
|
||||||
|
extra field (variable size)
|
||||||
|
file comment (variable size)
|
||||||
|
*/
|
||||||
|
|
||||||
|
constexpr int CENTRAL_DIRECTORY_BYTE = 46;
|
||||||
|
struct CentralDirectory {
|
||||||
|
|
||||||
|
uint32_t signature;
|
||||||
|
uint16_t versionMadeBy;
|
||||||
|
uint16_t versionNeededToExtract;
|
||||||
|
uint16_t generalBitFlag;
|
||||||
|
uint16_t compressionMethod; // no compression == 0
|
||||||
|
uint16_t lastModTime; // 압축 시점의 시간 (1980년 기준 시간)
|
||||||
|
uint16_t lastModDate; // 압축 시점의 날짜 (1980년 기준 연도)
|
||||||
|
uint32_t crc32;
|
||||||
|
uint32_t compressedSize; // same as unCompression (cuz no compreesion)
|
||||||
|
uint32_t unCompressedSize;
|
||||||
|
uint16_t fileNameLength;
|
||||||
|
uint16_t extraFieldLength;
|
||||||
|
uint16_t fileCommentLength;
|
||||||
|
|
||||||
|
uint16_t diskNumStart;
|
||||||
|
uint16_t attributeInternal;
|
||||||
|
uint32_t attributeExternal;
|
||||||
|
uint32_t offsetLocalHeader;
|
||||||
|
|
||||||
|
// var[fileNameLength] fileName
|
||||||
|
// var[extraFieldLength] extraField
|
||||||
|
// var[fileCommentLength] fileComment
|
||||||
|
};
|
||||||
|
|
||||||
|
/** End of central directory record:
|
||||||
|
|
||||||
|
end of central dir signature 4 bytes (0x0605 + 4b50)
|
||||||
|
number of this disk 2 bytes
|
||||||
|
number of the disk with the
|
||||||
|
start of the central directory 2 bytes
|
||||||
|
total number of entries in the
|
||||||
|
central directory on this disk 2 bytes
|
||||||
|
total number of entries in
|
||||||
|
the central directory 2 bytes
|
||||||
|
size of the central directory 4 bytes
|
||||||
|
offset of start of central
|
||||||
|
directory with respect to
|
||||||
|
the starting disk number 4 bytes
|
||||||
|
.ZIP file comment length 2 bytes
|
||||||
|
.ZIP file comment (variable size)
|
||||||
|
*/
|
||||||
|
constexpr int EOCD_BYTE = 22;
|
||||||
|
|
||||||
|
struct EoCDRecord {
|
||||||
|
uint32_t signature;
|
||||||
|
uint16_t diskNumber;
|
||||||
|
uint16_t diskNumber_CentralDirectoryStart;
|
||||||
|
uint16_t numOfCentralDirectory; // TODO : 이름 애매함.
|
||||||
|
uint16_t numEntries; // TODO : 이름 애매함.
|
||||||
|
uint32_t centralDirectorySize;
|
||||||
|
uint32_t centralDirectoryOffset;
|
||||||
|
uint16_t zipFileCommentLength;
|
||||||
|
|
||||||
|
// var[zipFileCommentLength] zipFileComment
|
||||||
|
};
|
||||||
|
|
||||||
|
#pragma pack(pop)
|
||||||
+4
-1
@@ -1,4 +1,4 @@
|
|||||||
<?xml version="1.0" encoding="utf-8"?>
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
<Project DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
|
<Project DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
|
||||||
<ItemGroup Label="ProjectConfigurations">
|
<ItemGroup Label="ProjectConfigurations">
|
||||||
<ProjectConfiguration Include="Debug|Win32">
|
<ProjectConfiguration Include="Debug|Win32">
|
||||||
@@ -125,6 +125,9 @@
|
|||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
<ClCompile Include="main.cpp" />
|
<ClCompile Include="main.cpp" />
|
||||||
</ItemGroup>
|
</ItemGroup>
|
||||||
|
<ItemGroup>
|
||||||
|
<ClInclude Include="Define.h" />
|
||||||
|
</ItemGroup>
|
||||||
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" />
|
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" />
|
||||||
<ImportGroup Label="ExtensionTargets">
|
<ImportGroup Label="ExtensionTargets">
|
||||||
</ImportGroup>
|
</ImportGroup>
|
||||||
|
|||||||
@@ -1,6 +1,46 @@
|
|||||||
#include <cstdio>
|
#include <cstdio>
|
||||||
|
#include "Define.h"
|
||||||
|
|
||||||
|
void Zipper();
|
||||||
|
|
||||||
int main()
|
int main()
|
||||||
{
|
{
|
||||||
std::printf("Hello Zip! \r\n");
|
std::printf("==================== Hello Zip! ====================\r\n");
|
||||||
|
|
||||||
|
int iRet = 0;
|
||||||
|
|
||||||
|
int iSizeTest = sizeof(LocalFileHeader);
|
||||||
|
if (LOCAL_FILE_HEADER_BYTE != iSizeTest)
|
||||||
|
{
|
||||||
|
std::printf("1 Wrong Header Size : %d / %d \r\n", iSizeTest, LOCAL_FILE_HEADER_BYTE);
|
||||||
|
iRet = -1;
|
||||||
|
}
|
||||||
|
iSizeTest = sizeof(CentralDirectory);
|
||||||
|
if (CENTRAL_DIRECTORY_BYTE != iSizeTest)
|
||||||
|
{
|
||||||
|
std::printf("2 Wrong Header Size : %d / %d \r\n", iSizeTest, CENTRAL_DIRECTORY_BYTE);
|
||||||
|
iRet = -1;
|
||||||
|
}
|
||||||
|
iSizeTest = sizeof(EoCDRecord);
|
||||||
|
if (EOCD_BYTE != iSizeTest)
|
||||||
|
{
|
||||||
|
std::printf("3 Wrong Header Size : %d / %d \r\n", iSizeTest, EOCD_BYTE);
|
||||||
|
iRet = -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (iRet != -1)
|
||||||
|
{
|
||||||
|
Zipper();
|
||||||
|
}
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
void Zipper()
|
||||||
|
{
|
||||||
|
LocalFileHeader LFHeader;
|
||||||
|
CentralDirectory CentDirec;
|
||||||
|
EoCDRecord ECDR;
|
||||||
|
|
||||||
|
|
||||||
}
|
}
|
||||||
Reference in New Issue
Block a user