压缩与解压缩问题?

到百度贴吧首页
新闻   网页   贴吧   知道   MP3   图片   视频   百科
    吧内搜索 | 帮助
  • 共有12篇贴子

压缩与解压缩问题?

1楼

AAA
BBBBBBBBBB
CCCCC
如果遇到同样的字符就把他压缩成一个字符,然后紧跟后面的一位存放该字符的个数.压缩成功后,还能解压缩.如何去写?

2楼

指的是 RLE (Run-Length Encoding 行程长度编码) 吧,算法我说一下,功课自己做。

一般最流行的是用 7 位来表示长度的,第一个字节最高位标志后面的是压缩的数据还是没压缩的,置位代表后面的一个字节是要重复的部分,因为只用了 7 位,所以最长只有 127 个字节,没置位代表后面的没有压缩,直接输出,长度也是由低 7 为代表。
----大概的伪代码----
while(!eof) {
  read_data(ch);
  if (count == 127) {
    buffer[0] |= 0x7F;
    write_buffer_to_file(buffer, 128);
    buffer[0] = count = 0;
  }
  count++;
  if (buffer[0] & 0x80) {
    if (ch != last_read_char)
      buffer[count] = last_read_char = ch;
    else {
      buffer[0] = 0x80 | count;
      write_buffer_to_file(buffer, count+1);
      buffer[0] = 0x81;
      count = 1;
      buffer[1] = last_read_char = ch;
    }
  } else {
    if (ch == last_read_char)
      buffer[0] |= ++count;
    else {
      buffer[0] = count;
      write_buffer_to_file(buffer, count+1);
      buffer[0] = 0;
      count = 1;
      buffer[1] = last_read_char = ch;
    }
  }
}

3楼

上面是压缩的,解压缩的就是先读第一个字节,看最高位是否置位,
是:重复第二个字节,次数由第一个字节的低 7 为决定。
否:后面的字节连续输出,长度由第一个字节的低 7 为决定。
然后不断重复这个过程。

随便给个思路,懒得上机试了,代码自己写吧。

4楼

晕,三楼的写反了,更正一下:
if (buffer[0] & 0x80) {
应该为
if (!(buffer[0] & 0x80)) {

5楼

啊~~打成全角的叹号了

6楼

真不小心,第二行的这个
write_buffer_to_file(buffer, count+1);
应该为:
write_buffer_to_file(buffer, 2);
抱歉了~~~以后再也不图快了~~

7楼

晕,真背啊~~~~是第三此调用的,不是第二行,
呵呵,就当我灌水吧

221.216.90.*

8楼

我刚刚写好的。。。。。比较滥,凑或看吧,在我的blog里
http://cjhacker.bokee.com/5249118.html

202.196.70.*

9楼

疑问:一般的文件中连续字节相同的概率很小吧?我觉得该方法不实用。
222.90.90.*

10楼

此方法多用在图形文件的压缩里,因为经常会出现同一片区域相同颜色的情况,呵呵
220.114.151.*

11楼

数据库文件也非常适合这种压缩方法。数据库文件有许多是空白字符(用记事本打开一个数据库文件看看就知道了)
221.1.40.*

12楼

网上用没有从幼儿园开始学的啊 ?
就是说从0开始教的?

发表回复

内 容:
用户名:
  
©2010 Baidu 贴吧协议  意见反馈