了解rle压缩的请帮帮忙

luxin24 2004-01-22 09:57:51
我想在vc下实现对经rle压缩的文件进行解压,不知该如何操作,尤其是对每一字节高位和低位进行读取不是很清楚,请高手详细指点
...全文
73 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
zzwu 2004-01-28
  • 打赏
  • 举报
回复
RLE既是一种编码名称(行程码),又是一种采用了行程码的特定图像文件的格式。
作为一种编码方式,谁都可以采用,这时具体的实现细节可以按自己的需要加以变化和改进。我以前曾用RLE编码方式来实现分子动画的各桢数据的压缩。方法大体和plainsong(短歌)讲的第二种办法类似,但还要复杂点:需要加行号。如果某帧某行数据与前桢完全相同,则后一桢的该行数据就可利用前桢的,所以本行什么也不用记录了!
但是作为微软采用的一种图像文件格式,则实现细节就完全被规定死了,不可以不同了。
短歌如风 2004-01-28
  • 打赏
  • 举报
回复
buffer2和buffer3都是char*类型的,也就是说是指针类型的变量,而<<和>>操作符要求操作数是“整数兼容类型”也就是说是[unsigned](char|short|int|long)类型。怀疑应该是data[i]=((*buffer2)<<4);

此外要注意操作数类型的符号,在取高字节时一定要先转换为无符号类型,否则可能会在右移时导致最高位扩展,也就是发生“算术右移”操作,而我们需要的是“逻辑右移”操作,也就是用零填充移位后的空位。标准中没有规定在对负的带符号数的右移操作的实现细节,但规定无符号数一定是“逻辑右移”。当然也可以在移位后用一个掩码来获得正确的数据,但不如先转型为无符号类型简单。
NowCan 2004-01-24
  • 打赏
  • 举报
回复
把data和buffer2的定义写出来,否则看不出来错在哪儿。
短歌如风 2004-01-22
  • 打赏
  • 举报
回复
rle压缩有很多种实现,不知道楼主说的是哪一种。基本原理就是用一个“长度”-“数据”对来表示多个连续的重复数据。但同时必须能也能够表示无重复的数据段,常用的方法有两种,一种是把无重复的数据段也看成是重复的,重复次数是1,这种方法适用于以连续重复数据为主的数据的压缩;另一种方法是通过某一个标志表明后面的数是N个重复的D还是N个不重复的数据D1、D2、——、DN。好象格式中的RLE就是用的第二种方法,具体记不太清了,由于是在网吧上网,手头没有资料没法查,建议楼主查一下MSDN。

取字节某几位的方法(C语言)
取字节D高N位:
x = (unsigned char)D >> (8 - N);
取字节D低N位:
x = D & ((1 << N) - 1);
取字节D从第I位开始(最低位为第0位)的N位:
x = ((unsigned char)D >> I) &((1 << N) - 1);
注意在右操作前要先转换为无符号数,这样才能保证移位时在高位补0。
luxin24 2004-01-22
  • 打赏
  • 举报
回复
编译通过了,可新问题又来了:
data[i]=((buffer2)<<4);编译不过
这样负值不可以吗?
NowCan 2004-01-22
  • 打赏
  • 举报
回复
char buffer1;
char buffer2;
buffer1 = databuffer[i]>>4; //高4位
buffer2 = databuffer[i]&0xf; //低4位

如果databuffer是char型的,这样就可以了。上面的代码怎么那么复杂?
luxin24 2004-01-22
  • 打赏
  • 举报
回复
我用以下代码实现对数据源databuffer任一字节进行取高四位和低四位,编译报错,能告诉我那里错了吗?
char* buffer1;
char* buffer2;
char* buffer3;
*buffer3 = databuffer[i];
*buffer1 = (unsigned short)buffer3>>4;
*buffer3 = databuffer[i];
*buffer2 = (unsigned short)buffer3&((1<<4)-1);
luxin24 2004-01-22
  • 打赏
  • 举报
回复
第二种形式的rle我不太明白,标志符在数据中是如何体现的呢?

33,029

社区成员

发帖
与我相关
我的任务
社区描述
数据结构与算法相关内容讨论专区
社区管理员
  • 数据结构与算法社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧