计算编码的整数方法

来源:互联网 发布:mac区域截屏保存在哪里 编辑:程序博客网 时间:2024/06/10 19:12

多谢    http://blog.sina.com.cn/hathuang" 小石的博客 启发,苦钻几天转换很多方法跌过很多的坑又爬起才完善破解。

1.创建字节概率表,记录字节所在区间(of开始位置,hf结束位)。字节出现次数的序列,例如asdfssf 串a(0-1)b(1-2)f(2-4)s

(4-7);

2.用一个j影射区(相当于磁带接信息),遍历全部数组,每次同步左移直到(of减去hf大于总数)影射区(每次新取of时加在影射区)同步左移,

of<<=1,hf<<=1,如果概率大(出现次数多) 《of-hf》移动很小位, 就使子区间大于总数,如果就1 次,即是要移最多的位才大于总数,也就是信息熵的概念。 

3.保在全部溢出的以及剩下数位(在影射区中所有的位的信息也就是of开始位置数的叠加但有序二进制数据)

4.解压过程,初始化概率表,用首字节对应表创建开始位数of,结束位数hf,同理左移直到hf-of在于总数,此时同时移位压宿数减去移位后of就是下一个解压 字节在概率表中开始位的数,解压的字节就是表中对应的字节,也就是分离前靣叠加数据,每次左移一位,在压宿的数据取出一位,一直循环到结束。特必注意的是初始时,在压宿的字节组最先要多少位,这要和编码时记录的溢出的位相对应。

  如有sasdaadhn字符串,在概率表

开始位置  本结束位置概率(出现数)///需要移动s/0-000000002-00000000-000000102///3a/2-000000105-0000010-0000001013///2d/5-000001016-00000110-000001112///3h/7-000001117-00000111-000010001///3n/7-000010108-00001000-00001001

 

1///4      

 

of-hf>总数  移位后结束后影射区同步左移 开始位置0000000000000000000000000000000加s开如位置(00000000)移3位也为0s+000000000000000000000000000000000001000加 a开始位(00000010)移3位(00001000)a+000010000000000000000000000000001000000加 s(00000000)移3位加(00000000)s+0000000000000000000000000000001000110000加 d(000000110)移动3位(00101000)000001100000000000000000000100011001000加 a(00000010)移2位(00001000)000000100000000000000000010001100101000加 a(00000010)移2位(00001000)000000100000000000000010001100101110000加 d(00000110)移3位(00110000)000001100000000000010001100101111111000加 h(00000111)移3位(00111000)000001110000000100011001011111111000000加 n(00001000)移4位(10000000)00001000

  上表最后1行即是压宿数据。或者说字节在概率表开始位置数浓宿值的叠加,解 码过程用前数同样同步左移直到hf-of>总数,影射数据-of剩下即是下1个字节位置,取该位置hf-of移位直到在于总数,用影射区数-of得下一个开始位数,直到结束,因为压宿数据中重叠成分,左移后减去了 前一个of同步左移即是该字节在概率表位置,也是压宿后数组保在第一字节数可得对应of和hf。同样保存概率表信息


更详细代码   html://lue62.cn:8080/index.html