生活随笔
收集整理的這篇文章主要介紹了
C语言打包解包文件程序(简易版)
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
??#include?<stdio.h>? ?#include?<string.h>? ?#include?<stdlib.h>? ?? ?typedef?unsigned?int??uint;? ?typedef?unsigned?char?byte;???????????? ?? ??#define?MAX_FILE_COUNT?10? ?? ??FILE*??g_pMasFile?=?NULL;? ???typedef?struct?SMaseFileHeader? ?{? ??uint??uFileFlag;???????????uint??uFileCount;??????????uint??uFileListOfs;????????uint??uMaxFileCount;???????uint??uFileSize;??????????}MaseHeader;? ?? ??typedef?struct?SFilesMessage? ?{? ??uint??uFileOfs;????????????uint??uFileSize;???????????char??szFileName[260];????}FilesMsg;? ???int?OpenMasFile(const?char*?path,?const?byte?onlyOpen)? ?{? ??uint???????uWriteCount;?????????byte???????bIsNew?=?0;??????????MaseHeader?header;??????????????FilesMsg???msg;??????????????????g_pMasFile?=?fopen(path,?"rb");????if?(g_pMasFile?==?NULL)?????? ??{? ???if?(onlyOpen?==?1)????????????????return?-1;?? ?? ???bIsNew?=?1;? ???g_pMasFile?=?fopen(path,?"wb");? ???if?(g_pMasFile?==?NULL)? ????return?-1;? ??}? ?????fclose(?g_pMasFile?);? ???g_pMasFile?=?fopen(path,?"rb+");? ??if?(g_pMasFile?==?NULL)? ???return?-1;? ?? ??if(bIsNew?==?1)??{? ???header.uFileFlag?????=?'ESAM';? ???header.uFileCount????=?0;? ???header.uFileListOfs??=?sizeof(MaseHeader);????header.uMaxFileCount?=?MAX_FILE_COUNT;? ???header.uFileSize?????=?sizeof(MaseHeader)?? ???????????+?(MAX_FILE_COUNT?*?sizeof(FilesMsg));? ???????fwrite(&header,?sizeof(MaseHeader),?1,?g_pMasFile);? ???memset(&msg,?0,?sizeof(FilesMsg));? ???uWriteCount?=?MAX_FILE_COUNT;? ???????while(uWriteCount--)? ??????fwrite(&msg,?sizeof(FilesMsg),?1,?g_pMasFile);? ??}? ??else??{? ??????????fread(&header,?sizeof(MaseHeader),?1,?g_pMasFile);? ??}? ?????if?(header.uFileFlag?!=?'ESAM')? ??{? ???fclose(g_pMasFile); ???printf("文件頭標記不對,錯誤!\n"); ???return?-1;? ??}? ?? ????if?(header.uMaxFileCount?!=?MAX_FILE_COUNT)? ??{? ???fclose(g_pMasFile);? ???printf("數據不完整,錯誤!\n"); ??????return?-1;? ??}? ?? ??return?0;? ?}? ?? ??int?WriteFileToPak(const?char*?path)? ?{? ??FilesMsg???fileMsg;????????MaseHeader?header;?????????uint???????uFileSize;? ??uint???????uFileListEndOfs;? ??byte*??????pBuff;? ??FILE*??????pFile?=?NULL;? ?? ??if?(g_pMasFile?==?NULL)? ??????return?-1;? ?? ??memset(&fileMsg,?0,?sizeof(FilesMsg));? ??fseek(g_pMasFile,?0,?SEEK_SET);?????? ????fread(&header,sizeof(MaseHeader),?1,?g_pMasFile);? ?? ??uFileListEndOfs?=?header.uFileCount?*?sizeof(FilesMsg)?+?header.uFileListOfs;? ?? ??pFile?=?fopen(path,?"rb");? ??if(pFile?==?NULL)? ??????return?-1;? ?? ??fseek(pFile,?0,?SEEK_END);? ??uFileSize?=?ftell(pFile);? ??fseek(pFile,?0,?SEEK_SET);? ?? ????strcpy(fileMsg.szFileName,path);? ??fileMsg.uFileOfs??=?header.uFileSize;? ??fileMsg.uFileSize?=?uFileSize;? ?? ??????fseek(g_pMasFile,?uFileListEndOfs,?SEEK_SET);? ??fwrite(&fileMsg,sizeof(FilesMsg),1,g_pMasFile);? ?? ????pBuff?=?(byte*)malloc(uFileSize);? ??fread(pBuff,uFileSize,1,pFile);? ?? ????fseek(g_pMasFile,header.uFileSize,SEEK_SET);? ??fwrite(pBuff,?uFileSize,?1,?g_pMasFile);? ?? ????free(pBuff);? ?? ????header.uFileCount?+=?1;? ??header.uFileSize??+=?uFileSize;? ?? ??fseek(?g_pMasFile,0,SEEK_SET);? ?? ????fwrite(&header,sizeof(MaseHeader),1,g_pMasFile);? ?? ??return?0;? ?}? ?? ??int?ReadFileFromPak(const?FilesMsg?msg,?byte*?_dst)? ?{? ??if?(?g_pMasFile?==?NULL?)? ??????return?-1;? ?? ??fseek(g_pMasFile,?msg.uFileOfs,SEEK_SET);? ??fread(_dst,?msg.uFileSize,?1,?g_pMasFile);? ?? ??return?0;? ?}? ?? ??int?GetFileMessage(?const?char*?path,?FilesMsg*?msg)? ?{? ??FilesMsg???fileMsg;????????MaseHeader?header;?????????uint???????uFileCount;????? ??if?(?g_pMasFile?==?NULL?||?msg?==?NULL?)? ??????return?-1;? ?? ????fseek(g_pMasFile,?0,?SEEK_SET);? ??fread(&header,?sizeof(MaseHeader),?1,?g_pMasFile);? ?? ??uFileCount?=?header.uFileCount;? ??while?(uFileCount--)? ??{? ??????fread(&fileMsg,?sizeof(FilesMsg),?1,g_pMasFile);? ?????????????if?(stricmp(fileMsg.szFileName,?path)?==?0?)? ??????{????????????? ????*msg?=?fileMsg;? ??????????return?0;? ??????}? ??}? ??return?-1;? ?}? ?? ??int?CloseMasFile(?void?)? ?{? ??if?(?g_pMasFile?==?NULL?)? ??????return?-1;? ?? ??fclose(?g_pMasFile?);? ??g_pMasFile?=?NULL;? ?? ??return?0;? ?} ???int?main(?void?)? ?{? ??int?ret;? ?? ??ret?=?OpenMasFile(?"E:\\PhotoPak.bin",0);? ??if?(?ret?==?-1?)? ??????goto?__exit;???? ??WriteFileToPak(?"E:\\珍貴.jpg"?);? ??WriteFileToPak(?"E:\\123.docx"?);? ??WriteFileToPak(?"E:\\456.txt"?);? ???__exit:? ??CloseMasFile();? ??return?0;? ?}?? ???int?main(?void?)? ?{? ??byte*???????pBuff;? ??FILE*???????pOutFile;? ??FilesMsg????getFileMsg;? ??int?????????ret;? ?? ??ret?=?OpenMasFile("E:\\PhotoPak.bin",?1);? ??if?(ret?==?-1)? ?????goto?__exit;? ??? ??ret?=?GetFileMessage("E:\\123.docx",?&getFileMsg);? ??if(ret?==?-1)? ?????goto?__exit;? ?? ??pBuff?=?(byte*)malloc(getFileMsg.uFileSize);? ??ret?=?ReadFileFromPak(getFileMsg,?pBuff);? ??if(ret?==?-1)? ??????goto?__exit_free;? ?? ??pOutFile?=?fopen("E:\\123_out.docx",?"wb");????if(ret?==?-1)? ??????goto?__exit_free;? ??? ??fwrite(?pBuff,?getFileMsg.uFileSize,?1,?pOutFile?);? ?????fclose(?pOutFile?);? ??????? ??__exit_free:? ??free(?pBuff?);? ?? ??__exit:? ?????CloseMasFile();? ?????return?0;? ?} ?? ?
轉載于:https://blog.51cto.com/591819849/1101479
總結
以上是生活随笔為你收集整理的C语言打包解包文件程序(简易版)的全部內容,希望文章能夠幫你解決所遇到的問題。
如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。