转自:http://blog.csdn.net/u013283835/article/details/70311499
最近在开发pdf电子签章过程中遇到了点棘手的问题,因为pdf标准支持读取zlib压缩后的stream对象,因此,可以通过这个手段将stream里面的操作数据用zlib解压出来,以此来研究里面的具体操作是什么,但是当我们用二进制将stream里面的数据读到文件里面的时候,会出现一些很棘手的错误,导致了很多人怀疑这条路是走不通的,这里,楼主贡献一下自己的思路:
问题1:读取完文件之后会自动出现,没错数据开头跟结尾会多加了0d0a也就是换行符,因为我们在用zlib解决的时候,会返回-3,也就是数据错误,解决方法就是将这4个字符删掉。
问题2:当我们在调用uncompress解压数据的时候,很有可能会在inflate_fast这个函数里面崩溃掉,原因是内存读取失败,也就是越界了,并且出错的地方是一些汇编代码。这让你很费解,到底该怎么办,汇编代码不太好搞定。这时候很多人就会在这里停住,可能会想起他的出路了。而楼主并没有因此而停止脚步,下面让我们揭开神秘的面纱:
首先我们打开inffast.c这个文件,拉到头,你会看到这样一行文字,如下,意思就是如果你用了汇编编译器来编译的话,那么很有可能汇编的代码有bug(坑。。。),而在zlib官网下载的zlib库默认的是定义了ASMINF这个库的,因此就出现了开头说的那个bug,问题到这里似乎就迎刃而解了,解决的方案就是将这个宏定义注释掉,也就是不使用汇编版的infate_fast函数,而是使用C语言版的,这样就不会出现问题了。一个人的开发,真是的很枯燥而且是考验心性的,我现在特别理解为什么公司招聘的时候都要先进行心理测试,问题一头雾水的时候,太考验各人心里的承受能力了,这几天快被这个折磨疯了