RLE行程长度压缩算法C版本
2015-07-08 16:22
806 查看
自己用c写了个rle压缩编码算法,代码写得不那么简洁,但是基本功能是实现的,用C写能更好地兼容嵌入式
/* 行程压缩算法V1.0 made by xyt 2015/7/4 */ #ifndef _RLE_H #define _RLE_H #include<stdio.h> using namespace std; //判断是否三个相同值 bool IsRepeat3(unsigned char *in,int rest) { if(rest<2) return false; else{ if(*in==*(in+1)&&*in==*(in+2)) return true; else return false; } } /* 获取非重复个数,个数为包括判决项直到后面 第一次三连重复的(三重复第一点不算)的个数 */ int GetNoRepeat3(unsigned char *in,int rest) { if(rest<=2) return rest+1; else{ int c=0,restc=rest; unsigned char *g=in; while(!IsRepeat3(g,restc)) { g++;restc--;c++; if(restc==0) return c+1; } return c; } } /* 数据压缩,返回压缩后数据大小 */ int Rle_Encode(unsigned char *inbuf,int insize,unsigned char *outbuf1,int outsize) { unsigned char *src=inbuf; unsigned char *outbuf=outbuf1; int rest=insize-1; int outrest=outsize; int count=0; while(rest>=0) { count=0; if(IsRepeat3(src,rest)) { while(rest>=0) { if(count>=127) break; if(*src==*(src+1)){src++; rest--; count++;}else{count++; break;} } if(outrest<2) return -1; *outbuf=count|128; outbuf++; *outbuf=*src; outbuf++; outrest-=2; src++;rest--; } else { if(IsRepeat3(src,rest)) continue; int num=GetNoRepeat3(src,rest); int i; if(outrest<(num+1)) return -1; *outbuf=num;outbuf++; for(i=0;i<num;i++){ *outbuf=*(src+i); outbuf++; } src+=num; rest-=num; outrest-=num+1; } } return outsize-outrest; } /* 解压数据,返回解压数据大小 */ int Rle_Decode(unsigned char *inbuf,int insize,unsigned char *outbuf,int outsize) { int inrest=insize; int outrest=outsize; int i; unsigned char *in=inbuf; unsigned char *out=outbuf; unsigned char ns; unsigned char tmp; while(inrest>=0) { ns=*in; if(ns==0) break; if(ns>128){ if((outrest-ns+128)<0) return -1; tmp=*(in+1); for(i=0;i<ns-128;i++){ *out=tmp; out++; } in+=2;inrest-=2;outrest-=ns-128; }else{ if((outrest-ns)<0) return -1; in++; for(i=0;i<ns;i++){ *out=*in; out++;in++; } inrest-=1+ns;outrest-=ns; } } return outsize-outrest; } #endif
相关文章推荐
- [leetcode][hash] Contains Duplicate III
- Java Signal实例
- Asp.net mvc4 + HighCharts + 曲线图
- Dynamics AX 2012 R2 从代码中调用SSRS Report
- 将myeclipse中现有的项目连接到svn
- 扩展MongoDB C# Driver的QueryBuilder
- terminal,桌面快捷键和eclipse
- 高山仰止,景行行止。虽不能至,然心向往之。
- SAP SQ01如何从开发机传输到生产机
- Java集合 之 List 集合
- (剑指Offer)面试题10:二进制中1的个数
- 烦恼的高考志愿(university)
- 黑马程序员——C语言基础---流程控制(选择结构,循环结构)
- java三大框架是什么?
- javac编译报错非法字符
- MFC中代码控制控件是否显示与是否可用等
- (链接保存)CentOS 6.6下yum快速升级内核
- 通知 Notification
- PHP实现验证码
- Asp.net mvc4 + HighCharts + 柱状图