日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

zlib解压 被压缩的PDF(关键字FlateDecode)

發布時間:2023/12/20 编程问答 30 豆豆
生活随笔 收集整理的這篇文章主要介紹了 zlib解压 被压缩的PDF(关键字FlateDecode) 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

PDF被壓縮了,但從網上看這個壓縮算法就是zlib的壓縮算法,下面的亂碼就是壓縮導致的亂碼,現在需要把這些亂碼復原

%PDF-1.7 %溷弦 4 0 obj <</Length 3 0 R/Filter/FlateDecode>> stream x渆QMK聾}&跉MIb酈Q鰳娵R芻??焱zR< ?|3狣B6?颿f?滕,鞃?珈毿輥紆拶迨鷚#Ef? B?]蔑!?臘}?嫖?疇滁!鈠?v僣$貇憮b勴72? 溔%f."@4擫忶睵?舊?犼\銭/'S/鱐篖x!籤&鈾'Q:?肶O鷾p罷琑厹T?(?5- 瞪苑趬nf艤].O跧9n悪v駝寏w?W</僰?溏D_櫧{耑`_佄D崣j旮c楣?[?蟒驅 躚7Q endstream endobj 3 0 obj 280 endobj
  • 構建一個Win32的應用程序,zlib_test(我用的VS2010)
  • 前面已經編譯過zlib了,不知道怎么編譯的zlib static lib的可以前面翻翻看看
  • 添加zlib到工程中,就是添加一個靜態庫,把zlib.lib放到你的工程(*.vcxproj所在d)目錄下
  • 工程->屬性->配置屬性->鏈接器->輸入->附加依賴項->添加 zlib.lib
  • 工程->屬性->配置屬性->VC++目錄->庫目錄 添加$(ProjectDir)
  • 工程->屬性->配置屬性->VC++目錄->包含目錄 添加$(ProjectDir)\include
  • 在工程目錄下創建include,然后把zlib的.h文件都copy過來
  • 不好意思,剛發現zlib中有例子不用創建工程了
  • 直接用解壓好的‘解決方案'中的testzlib,SourceFile中有testzlib.c,里面就是個壓縮和解壓的例子。
  • 代碼我貼下 ,別害怕,這是我在原來代碼的基礎上改的,真正用的代碼很少,看后面
  • #include <stdio.h> #include <stdlib.h> #include <windows.h>#include "zlib.h"void MyDoMinus64(LARGE_INTEGER *R,LARGE_INTEGER A,LARGE_INTEGER B) {R->HighPart = A.HighPart - B.HighPart;if (A.LowPart >= B.LowPart)R->LowPart = A.LowPart - B.LowPart;else{R->LowPart = A.LowPart - B.LowPart;R->HighPart --;} }#ifdef _M_X64 // see http://msdn2.microsoft.com/library/twchhe95(en-us,vs.80).aspx for __rdtsc unsigned __int64 __rdtsc(void); void BeginCountRdtsc(LARGE_INTEGER * pbeginTime64) {// printf("rdtsc = %I64x\n",__rdtsc());pbeginTime64->QuadPart=__rdtsc(); }LARGE_INTEGER GetResRdtsc(LARGE_INTEGER beginTime64,BOOL fComputeTimeQueryPerf) {LARGE_INTEGER LIres;unsigned _int64 res=__rdtsc()-((unsigned _int64)(beginTime64.QuadPart));LIres.QuadPart=res;// printf("rdtsc = %I64x\n",__rdtsc());return LIres; } #else #ifdef _M_IX86 void myGetRDTSC32(LARGE_INTEGER * pbeginTime64) {DWORD dwEdx,dwEax;_asm{rdtscmov dwEax,eaxmov dwEdx,edx}pbeginTime64->LowPart=dwEax;pbeginTime64->HighPart=dwEdx; }void BeginCountRdtsc(LARGE_INTEGER * pbeginTime64) {myGetRDTSC32(pbeginTime64); }LARGE_INTEGER GetResRdtsc(LARGE_INTEGER beginTime64,BOOL fComputeTimeQueryPerf) {LARGE_INTEGER LIres,endTime64;myGetRDTSC32(&endTime64);LIres.LowPart=LIres.HighPart=0;MyDoMinus64(&LIres,endTime64,beginTime64);return LIres; } #else void myGetRDTSC32(LARGE_INTEGER * pbeginTime64) { }void BeginCountRdtsc(LARGE_INTEGER * pbeginTime64) { }LARGE_INTEGER GetResRdtsc(LARGE_INTEGER beginTime64,BOOL fComputeTimeQueryPerf) {LARGE_INTEGER lr;lr.QuadPart=0;return lr; } #endif #endifvoid BeginCountPerfCounter(LARGE_INTEGER * pbeginTime64,BOOL fComputeTimeQueryPerf) {if ((!fComputeTimeQueryPerf) || (!QueryPerformanceCounter(pbeginTime64))){pbeginTime64->LowPart = GetTickCount();pbeginTime64->HighPart = 0;} }DWORD GetMsecSincePerfCounter(LARGE_INTEGER beginTime64,BOOL fComputeTimeQueryPerf) {LARGE_INTEGER endTime64,ticksPerSecond,ticks;DWORDLONG ticksShifted,tickSecShifted;DWORD dwLog=16+0;DWORD dwRet;if ((!fComputeTimeQueryPerf) || (!QueryPerformanceCounter(&endTime64)))dwRet = (GetTickCount() - beginTime64.LowPart)*1;else{MyDoMinus64(&ticks,endTime64,beginTime64);QueryPerformanceFrequency(&ticksPerSecond);{ticksShifted = Int64ShrlMod32(*(DWORDLONG*)&ticks,dwLog);tickSecShifted = Int64ShrlMod32(*(DWORDLONG*)&ticksPerSecond,dwLog);}dwRet = (DWORD)((((DWORD)ticksShifted)*1000)/(DWORD)(tickSecShifted));dwRet *=1;}return dwRet; }int ReadFileMemory(const char* filename,long* plFileSize,unsigned char** pFilePtr) {FILE* stream;unsigned char* ptr;int retVal=1;printf("filename = %s\n",filename);stream=fopen(filename, "rb");if (stream==NULL){printf("stream == NULL\n");return 0;}fseek(stream,0,SEEK_END);*plFileSize=ftell(stream);printf("*plFileSize = %d\n",*plFileSize);fseek(stream,0,SEEK_SET);ptr=malloc((*plFileSize)+1);if (ptr==NULL)retVal=0;else{if (fread(ptr, 1, *plFileSize,stream) != (*plFileSize))retVal=0;}fclose(stream);*pFilePtr=ptr;return retVal; } #if 1int main(int argc, char *argv[]) {const char *uncom_file_name = "uncom.txt";long lFileSize1 = 0;unsigned char * FilePtr = NULL;int err = 0;uLongf uncom_len = 1024;Bytef uncom_buf[1024];memset(uncom_buf,0x00,sizeof(uncom_buf));if(ReadFileMemory(uncom_file_name,&lFileSize1,&FilePtr)==0){printf("error reading %s\n",uncom_file_name);return 1;}else{printf("file %s read ,%d bytes\n",uncom_file_name,lFileSize1);}err = uncompress(uncom_buf,&uncom_len,FilePtr,lFileSize1);printf("uncom_len = %d\n",uncom_len);if (err != Z_OK){printf("err = %d\n",err);return 1;}if(FilePtr != NULL){free(FilePtr);FilePtr = NULL;}printf("uncom_buf = %s\n",uncom_buf);return 0; } #else int main(int argc, char *argv[]) {int BlockSizeCompress=0x8000;int BlockSizeUncompress=0x8000;int cprLevel=Z_DEFAULT_COMPRESSION ;long lFileSize;unsigned char* FilePtr;long lBufferSizeCpr;long lBufferSizeUncpr;long lCompressedSize=0;unsigned char* CprPtr;unsigned char* UncprPtr;long lSizeCpr,lSizeUncpr;DWORD dwGetTick,dwMsecQP;LARGE_INTEGER li_qp,li_rdtsc,dwResRdtsc;if (argc<=1){printf("run TestZlib <File> [BlockSizeCompress] [BlockSizeUncompress] [compres. level]\n");return 0;}if (ReadFileMemory(argv[1],&lFileSize,&FilePtr)==0){printf("error reading %s\n",argv[1]);return 1;}else printf("file %s read, %u bytes\n",argv[1],lFileSize);if (argc>=3)BlockSizeCompress=atol(argv[2]);if (argc>=4)BlockSizeUncompress=atol(argv[3]);if (argc>=5)cprLevel=(int)atol(argv[4]);lBufferSizeCpr = lFileSize + (lFileSize/0x10) + 0x200;lBufferSizeUncpr = lBufferSizeCpr;CprPtr=(unsigned char*)malloc(lBufferSizeCpr + BlockSizeCompress);BeginCountPerfCounter(&li_qp,TRUE);dwGetTick=GetTickCount();BeginCountRdtsc(&li_rdtsc);{z_stream zcpr;int ret=Z_OK;long lOrigToDo = lFileSize;long lOrigDone = 0;int step=0;memset(&zcpr,0,sizeof(z_stream));deflateInit(&zcpr,cprLevel);zcpr.next_in = FilePtr;zcpr.next_out = CprPtr;do{long all_read_before = zcpr.total_in;zcpr.avail_in = min(lOrigToDo,BlockSizeCompress);zcpr.avail_out = BlockSizeCompress;ret=deflate(&zcpr,(zcpr.avail_in==lOrigToDo) ? Z_FINISH : Z_SYNC_FLUSH);lOrigDone += (zcpr.total_in-all_read_before);lOrigToDo -= (zcpr.total_in-all_read_before);step++;} while (ret==Z_OK);lSizeCpr=zcpr.total_out;deflateEnd(&zcpr);dwGetTick=GetTickCount()-dwGetTick;dwMsecQP=GetMsecSincePerfCounter(li_qp,TRUE);dwResRdtsc=GetResRdtsc(li_rdtsc,TRUE);printf("total compress size = %u, in %u step\n",lSizeCpr,step);printf("time = %u msec = %f sec\n",dwGetTick,dwGetTick/(double)1000.);printf("defcpr time QP = %u msec = %f sec\n",dwMsecQP,dwMsecQP/(double)1000.);printf("defcpr result rdtsc = %I64x\n\n",dwResRdtsc.QuadPart);}CprPtr=(unsigned char*)realloc(CprPtr,lSizeCpr);UncprPtr=(unsigned char*)malloc(lBufferSizeUncpr + BlockSizeUncompress);BeginCountPerfCounter(&li_qp,TRUE);dwGetTick=GetTickCount();BeginCountRdtsc(&li_rdtsc);{z_stream zcpr;int ret=Z_OK;long lOrigToDo = lSizeCpr;long lOrigDone = 0;int step=0;memset(&zcpr,0,sizeof(z_stream));inflateInit(&zcpr);zcpr.next_in = CprPtr;zcpr.next_out = UncprPtr;do{long all_read_before = zcpr.total_in;zcpr.avail_in = min(lOrigToDo,BlockSizeUncompress);zcpr.avail_out = BlockSizeUncompress;ret=inflate(&zcpr,Z_SYNC_FLUSH);lOrigDone += (zcpr.total_in-all_read_before);lOrigToDo -= (zcpr.total_in-all_read_before);step++;} while (ret==Z_OK);lSizeUncpr=zcpr.total_out;inflateEnd(&zcpr);dwGetTick=GetTickCount()-dwGetTick;dwMsecQP=GetMsecSincePerfCounter(li_qp,TRUE);dwResRdtsc=GetResRdtsc(li_rdtsc,TRUE);printf("total uncompress size = %u, in %u step\n",lSizeUncpr,step);printf("time = %u msec = %f sec\n",dwGetTick,dwGetTick/(double)1000.);printf("uncpr time QP = %u msec = %f sec\n",dwMsecQP,dwMsecQP/(double)1000.);printf("uncpr result rdtsc = %I64x\n\n",dwResRdtsc.QuadPart);}if (lSizeUncpr==lFileSize){if (memcmp(FilePtr,UncprPtr,lFileSize)==0)printf("compare ok\n");}return 0; } #endif
  • 這是當前用的代碼
  • #include <stdio.h> #include <stdlib.h> #include <windows.h>#include "zlib.h" int ReadFileMemory(const char* filename,long* plFileSize,unsigned char** pFilePtr) {FILE* stream;unsigned char* ptr;int retVal=1;stream=fopen(filename, "rb");if (stream==NULL){printf("stream == NULL\n");return 0;}fseek(stream,0,SEEK_END);*plFileSize=ftell(stream);fseek(stream,0,SEEK_SET);ptr=malloc((*plFileSize)+1);if (ptr==NULL)retVal=0;else{if (fread(ptr, 1, *plFileSize,stream) != (*plFileSize))retVal=0;}fclose(stream);*pFilePtr=ptr;return retVal; } /* * 從uncom.txt中讀取內容,然后解壓縮 */ int main(int argc, char *argv[]) {const char *uncom_file_name = "uncom.txt";long lFileSize1 = 0;unsigned char * FilePtr = NULL;int err = 0;uLongf uncom_len = 1024;Bytef uncom_buf[1024];memset(uncom_buf,0x00,sizeof(uncom_buf));if(ReadFileMemory(uncom_file_name,&lFileSize1,&FilePtr)==0){printf("error reading %s\n",uncom_file_name);return 1;}else{printf("file %s read ,%d bytes\n",uncom_file_name,lFileSize1);}err = uncompress(uncom_buf,&uncom_len,FilePtr,lFileSize1);printf("uncom_len = %d\n",uncom_len);if (err != Z_OK){printf("err = %d\n",err);return 1;}if(FilePtr != NULL){free(FilePtr);FilePtr = NULL;}printf("uncom_buf = %s\n",uncom_buf);return 0; }
  • 這里有幾種錯誤,先說第一種 uncompress第二個參數 uncom_len 定義為0,這個參數要大于你解壓后的數據,所以你先要估計這這個值的大小,這個定義為0的情況下會報錯為 Z_DATA_ERROR
  • 第二種錯誤,還是第二個參數定義的過小,比如我這里剛開始定義了大小是512,太TM巧了,我的解壓縮的數據最后發現是513的大小。。。如果這里定義太小會報錯為Z_BUF_ERROR,當然網上說這個變量定義的類型不對也會報這個錯誤,我沒試過
  • 第三種錯誤,出現運行時候崩潰,看下堆棧信息是報錯在inflate_fast中,在匯編中,嘗試了這位兄弟的方法zlib uncompress解壓數據inflate_fast函數出錯的解決辦法,是可行的。要注意的是,對應的匯編的函數名字改的話要改全,改完之后還需要手動去刪除contrib\masmx86 下的inffas32.lst 和inffas32.obj 點擊解決方案,重新生成,
  • 下面是我解壓出來的數據
  • q 1 0 0 1 50 700 cm BT /F0 24 Tf 0 0 Td [( )20( )]TJ ET Q q BT /F0 24 Tf 0 TL 50 676 Td ( \n \r \r \r )Tj 0 -24 Td ( \n \r \n )Tj 0 -24 Td ( \r \n \n \n )Tj 0 -24 Td [( \r )20( \n \r )]TJ 0 -24 Td [( \r \r )20( \n )20( )]TJ ET Q

    有問題歡迎留言

    總結

    以上是生活随笔為你收集整理的zlib解压 被压缩的PDF(关键字FlateDecode)的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。

    主站蜘蛛池模板: 国产一区亚洲 | 精品看片 | 在线1区| 天天射天天操天天干 | 97视频在线| 少妇高潮一区二区三区喷水 | 夜夜草网站 | 爱情岛亚洲论坛入口福利 | 91高清视频 | 羞羞成人| 精品成人18 | 亚洲一区二区三区色 | 日韩三级a | аⅴ资源天堂资源库在线 | 国产精品高潮呻吟久久aⅴ码 | 在线视频精品一区 | a天堂资源 | 丝袜人妻一区二区 | 黄页免费网站 | 精品视频国产 | 国产欧美网站 | h视频在线观看网站 | 熟妇高潮一区二区 | 欧洲久久久久 | 亚洲色诱 | 涩涩视频网址 | 中文字幕国内自拍 | 2021国产精品视频 | 国产乱子伦精品 | 好吊色综合 | 天天精品综合 | 扩阴视频 | 日本一区二区三区四区视频 | 国产毛片一区二区三区va在线 | 免费中文字幕日韩 | 一区二区视频在线免费观看 | ass东方小嫩模pics | 干爹你真棒插曲mv在线观看 | 国产福利一区在线观看 | 超碰日日夜夜 | 九九在线观看视频 | 欧美色涩| 日韩操操操 | 精品中文在线 | 国产精品国产一区二区 | 欧美大肚乱孕交hd孕妇 | 17草在线| 亚洲黄色精品视频 | 美丽的姑娘在线观看 | 99热在线只有精品 | 实拍女处破www免费看 | 粉嫩av一区二区三区 | ts人妖在线 | 美女网站在线免费观看 | 国产精品久久久久毛片大屁完整版 | 九九视频这里只有精品 | 2025韩国大尺度电影 | 国产又色又爽又黄又免费 | 欧美三区 | 成人永久免费 | 深夜福利视频在线观看 | 成年人免费看毛片 | 亚洲欧美日韩综合 | 在线看国产视频 | 在线看麻豆| 精品国产视频一区二区三区 | 天天操天天操天天操 | 黄色亚洲网站 | 国产女人毛片 | 亚洲日本在线观看视频 | 精品国产aⅴ一区二区三区四川人 | 中文在线字幕观看 | 99热只有这里有精品 | 国产精品欧美激情 | 射区导航 | 日韩影视一区二区三区 | 色网av| 国产成人亚洲综合a∨婷婷 台湾a级片 | 黄色aaaa| 性折磨bdsm欧美激情另类 | 婷婷国产成人精品视频 | 亚洲老女人av | 毛片一二三区 | 成人午夜视频在线观看 | 亚洲欧美激情在线观看 | 嫩草国产在线 | 一区二区三区四区欧美 | 国产又粗又硬又长又爽的演员 | 欧美一区在线观看视频 | 三级av毛片 | 一级片网址 | www.久久爱 | 成年人网站黄色 | 免费观看已满十八岁 | 麻豆91精品91久久久 | 糖心av | 成人黄色免费视频 | av天天有 | 成人在线视频免费观看 |