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
  1. 构建一个Win32的应用程序,zlib_test(我用的VS2010)
  2. 前面已经编译过zlib了,不知道怎么编译的zlib static lib的可以前面翻翻看看
  3. 添加zlib到工程中,就是添加一个静态库,把zlib.lib放到你的工程(*.vcxproj所在d)目录下
  4. 工程->属性->配置属性->链接器->输入->附加依赖项->添加 zlib.lib
  5. 工程->属性->配置属性->VC++目录->库目录 添加$(ProjectDir)
  6. 工程->属性->配置属性->VC++目录->包含目录 添加$(ProjectDir)\include
  7. 在工程目录下创建include,然后把zlib的.h文件都copy过来
  8. 不好意思,刚发现zlib中有例子不用创建工程了
  9. 直接用解压好的‘解决方案'中的testzlib,SourceFile中有testzlib.c,里面就是个压缩和解压的例子。
  10. 代码我贴下 ,别害怕,这是我在原来代码的基础上改的,真正用的代码很少,看后面
#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
  1. 这是当前用的代码
#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;
}
  1. 这里有几种错误,先说第一种 uncompress第二个参数 uncom_len 定义为0,这个参数要大于你解压后的数据,所以你先要估计这这个值的大小,这个定义为0的情况下会报错为 Z_DATA_ERROR
  2. 第二种错误,还是第二个参数定义的过小,比如我这里刚开始定义了大小是512,太TM巧了,我的解压缩的数据最后发现是513的大小。。。如果这里定义太小会报错为Z_BUF_ERROR,当然网上说这个变量定义的类型不对也会报这个错误,我没试过
  3. 第三种错误,出现运行时候崩溃,看下堆栈信息是报错在inflate_fast中,在汇编中,尝试了这位兄弟的方法zlib uncompress解压数据inflate_fast函数出错的解决办法,是可行的。要注意的是,对应的汇编的函数名字改的话要改全,改完之后还需要手动去删除contrib\masmx86 下的inffas32.lst 和inffas32.obj 点击解决方案,重新生成,
  4. 下面是我解压出来的数据
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. Zlib解压/压缩实现

    Zlib解压/压缩实现 针对目前2503平台,请参考以下方式实现zlib解压/压缩文件: 1:将plutommi\Customer\ResGenerator\zlib整个文件夹copy到贵司的modu ...

  2. linux(64位)安装rar,并解压被压缩成多个rar的文件

    安装rar 下载rar安装包 下载地址:http://www.rarsoft.com/download.htm, 根据操作系统选择对应的二进制安装包,我的Redhat操作系统为64bit,因此下载的r ...

  3. 不需要解压使用对pdf文件进行压缩

    我们在压缩文件的时候通常是将文件压缩为zip这种格式,然后在我们需要使用上的时候再将文件进行解压,这样压缩文件的方法是2345.360压缩的原理,需要解压还得安装相应的解压软件才能实现. 小编最近因为 ...

  4. python自带库zlib_python中的zlib解压

    根据RFC 1950,"OK"0x789C和"bad"0x78DA之间的区别在FLEVEL位字段中:FLEVEL (Compression level) The ...

  5. linux解压多个part rar,【linux】安装rar,并解压被压缩成多个rar的文件

    rar  官网:http://www.rarsoft.com/download.htm 选择  RAR for  linux   (注意你的系统是32位还是64位) 1 安装命令: $ cd /roo ...

  6. C/C++Zlib 解压文件

    还是记下来吧,用了这么N多次了,博客方便点 .h头文件 #include <string> using namespace std;class ZlibClass { public:sta ...

  7. linux中zlib解压错误,zipimport.zipimporter错误:无法解压缩数据;zlib在Linux中不可用...

    我有两个python版本,分别是2.6和2.7,如下所示#python --version Python 2.6.6 #/usr/local/python27/bin/python2.7 --vers ...

  8. java zlib 解压_在javascript中解压缩gzip和zlib字符串

    Pako是一个完整而现代的 Zlib 端口 . 这是一个非常简单的例子,你可以从那里开始工作 . 得到pako.js你可以像这样解压缩byteArray: Gunzipping binary gzip ...

  9. android http zlib,利用zlib库对HTTP收到的gzip数据解压

    1.首先说为什么采用zlib解压,因为zlib可以解压内存数据. 2.下载zlib库后,自己在projcts目录里面根据需要编译lib库 3.静态链接只需要zlib.h ;zconf.h;zlib.l ...

最新文章

  1. LeetCode Longest Repeating Character Replacement(滑动窗口)
  2. 从内涵段子到皮皮虾,娱乐App为何不能一鱼两吃?
  3. inspect python模块_Python inspect模块:仅限关键字参数
  4. PADS 改变图纸和图页边界大小
  5. C语言程序设计(第三版)何钦铭著 习题4-10
  6. 织梦响应式酒店民宿住宿类网站织梦模板(自适应手机端)
  7. TI-TMS320F28335学习详解(2)::F28335片上资源详解
  8. Web运维之安全配置指导手册
  9. 小澳的葫芦(最短路)
  10. 【前后端常见的登录方式】
  11. MacBook pro新手教程
  12. eversync safari_Eversync:书签同步插件
  13. UVM TLM FIFO通信 示例
  14. IOC AOP OOP拙见
  15. 2d与2.5d坐标转换_视觉SLAM:搞定坐标系、三角测量、PnP
  16. 身份证号码编码方法及校验算法
  17. 三方线上美食城|基于Springboot的三方线上美食商城系统
  18. c语言程序设计的水电费问题,C语言程序设计A综合程序设计.pptx
  19. 开源 非开源_一个开源糖果店里的孩子
  20. 什么是工作流管理系统

热门文章

  1. MySQL6天笔记——day01
  2. Centos8安装Python3
  3. 零样本分割系列论文(2)Open-Vocabulary Instance Segmentation via Robust Cross-Modal Pseudo-Labeling
  4. 数据通信网络的基本概念
  5. Python习题册_from_big brother
  6. 团队项目(2.4) -- 《基于瞳孔检测的注意力检测研究》文献综述
  7. css中col-lg-1是什么意思,css - 引导程序中“col-md-4”,“col-xs-1”,“col-lg-2”中数字的含义...
  8. 交换机/路由器的存储介质
  9. 如何设置和开始使用Synology NAS
  10. 《功夫》“经典”台词