在研究PDF时,碰到XREF有/Filter/FlateDecode/DecodeParms<</Columns 7/Predictor 12>>这玩意,inflate解压缩后的数据还需要进行PNG Filter Up算法的反向处理。
PNG过滤器filter up存贮,会不会在char计算时越界丢失数据的问题?
一、整型常数:按编译器的长度进行存贮,VC的整型为4字节,则是存成4字节。
数值是以补码存贮的。
变量值 char型 int型=整型常数
-1 FFH FF FF FF FF 负数直接在前面扩1
-2 FEH FF FF FF FE
-128 80H FF FF FF 80
127 7FH 00 00 00 7F 正数直接在前面扩0
0 00H 00 00 00 00
char型只能表示-128~127。
二、char 和 unsigned char 之间赋值 ,只是把二进制8位相互交换!不管正负数。
比如unsigned char是80H,表示的值是128。赋给char后,char也是80H,表示的值是-128。
三、
字符型赋予整型,由于字符型为一个字节,而整型为多字节,故将字符的 ASCII 码值放到整型量的低8位中,其它位为 0。
整型赋予字符型,只把低8位赋予字符量。
char c; int i;
c=0x80; 0x80是整型常数,按4字节存贮是00 00 00 80,只把低8位赋予char,则c存的是80H,即c值是-128;
c=128; 128是整型常数,00 00 00 80,同0x80情况,c值是-128;
i=c+c; char 型和short型参与运算时,必须先转换成int型。得到i=-256。
c=c+c; 即整型-256赋给char,FFFFFF00,只把低8位赋予char,则c存的是00H,即c值是0;
四、PNG过滤器filter up
PNG过滤器2=filter up ,原理是存贮与上一行对应字节的差值。
其实filter up编码后每行第一个字节是02H,表示是PNG过滤器2,其它的才是有效数据。这里忽略这个02H。
(1)比如原始数据:
第一行FF
第二行00
计算:FFH读入char,值为-1。 0-(-1)=1,则filter up编码后得数据:
第一行FF
第二行01
反向filter up解码时,是FFH读入char,值为-1。 -1+1=0,得到第二行数据是0,完美恢复了第二行数据。
(2)比如原始数据:
第一行80
第二行00
计算:80H读入char,值为-128。 0-(-128)=128,128存到char是0x80即值-128。
则filter up编码后得数据:
第一行80
第二行80
反向filter up解码时,是80H读入char,值为-128。 -128+(-128)=-256,-256存到char是0x00即值0。得到第二行数据是0,完美恢复了第二行数据。
所以,这种单字节差值的存贮方式,是可以正常用char存贮和计算的。
解码代码及相关见其它网友的:
《PDF 参照流/交叉引用流对象(cross-reference stream)的解析方法》
《PNG的工作原理》
《png的故事:获取图片信息和像素内容》
https://www.w3.org/TR/PNG-Filters.html