char int unsinged型计算赋值时数据情况,PDF的XREF的PNG的filter up过滤器


在研究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


 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值