游程编码问题
2016-02-29 11:25
453 查看
游程编码问题
请实现游程编码的编码函数和解码函数。
提示:游程编码的概念是,
给一块数据,如:0x11 0x11 0x11 0x22 0x33 0x33 0x33 0x33 0x33,
那么游程编码的结果是:0x11 0x3 0x22 0x1 0x33 0x5
//主函数
//加码动作
//解码动作
请实现游程编码的编码函数和解码函数。
提示:游程编码的概念是,
给一块数据,如:0x11 0x11 0x11 0x22 0x33 0x33 0x33 0x33 0x33,
那么游程编码的结果是:0x11 0x3 0x22 0x1 0x33 0x5
//主函数
#include <stdio.h> //函数声明 extern void *coding(void *string,int *num); //编码函数 extern void *de_data(void *string,int *num); //解码函数 int main() { //编码动作 int num,i=0; unsigned char buf[]={0x11,0x11,0x11,0x22,0x33,0x33,0x33,0x33,0x33}; num = sizeof(buf)/sizeof(buf[0]); //打印原码 printf("The original code is:\n"); for(i=0;i<num;i++) { printf(" 0x%x",buf[i]); } printf("\n"); unsigned char *cod_data; //定义一个接收编码的空间 cod_data=coding(buf,&num); //调用编码函数 //打印编码 printf("After the coding is:\n"); for(i=0;i<num;i++) { printf(" 0x%x",cod_data[i]); } printf("\n"); //解码动作 unsigned char *decode_data; //定义一个接收解码的空间 decode_data = de_data(cod_data,&num); //调用解码函数 //打印解码 printf("After decoding is:\n"); for(i=0;i<num;i++) { printf(" 0x%x",decode_data[i]); } printf("\n"); free(cod_data); free(decode_data); return 0; }
//加码动作
#include<stdio.h> #include<stdlib.h> /************************************************************************* read_len:原码长度 count:1,原码中不相等值的个数 2,计算原码中相邻相等值的个数 teamdata:临时存放空间 read_data:指向原码空间 cod_data:指向编码空间 **************************************************************************/ void *coding(void *string,int *num) { int i=1,count=1; int read_len; unsigned char *read_data = (unsigned char *)string; read_len = *num; unsigned char teamdata; unsigned char *code_data; if(read_data == NULL) { return NULL; } //计算编码后所需要的空间的大小 teamdata = read_data[0]; for(i=1;i<read_len;i++) { if(teamdata != read_data[i]) { count++; teamdata = read_data[i]; } } code_data = (unsigned char *)malloc(count*2); if(code_data == NULL) { return NULL; } *num = count*2; //将原码长度指向编码后的长度 count = 1; int code_len = 0; //编码动作 code_data[code_len++]=read_data[0]; teamdata = read_data[0]; for(i=1;i<read_len;i++) { if(teamdata != read_data[i]) { code_data[code_len++] = count; code_data[code_len++] = read_data[i]; teamdata = read_data[i]; count = 1; continue; } else { count++; } code_data[code_len] = count; } //下面我用code_data两次一个循环来保存编码后的值,也可以实现成功编码, /* i = 0; for(i=0;i<read_len;i++) { if(read_data[i+1] != read_data[i]) { code_data[code_len] = read_data[i]; code_data[code_len+1] = count; code_len = code_len + 2; count = 1; } else { count++; } } */ return code_data; }
//解码动作
#include<stdio.h> #include<stdlib.h> /************************************************************************* cod_len:原码长度 count:解码后长度 ret_len:原码中相邻并值相同的个数 decode:原码指向空间 ret_data:解码后指向空间 **************************************************************************/ void *de_data(void *string,int *num) { int cod_len,i=1; cod_len = *num; unsigned char *decode = (unsigned char *)string; if(decode == NULL) { return NULL; } int count = 0; unsigned char *ret_data; for(i=1;i<cod_len;i=i+2) { count += decode[i]; } *num = count; ret_data = (unsigned char *)malloc(count); if(ret_data == NULL) { return NULL; } //解码动作 count = 0; i = 0; int ret_len = 0,j = 0; for(i=0;i<cod_len;i=i+2) { count = decode[i+1]; for(j=0;j<count;j++) { ret_data[ret_len++] = decode[i]; } } return ret_data; }
相关文章推荐
- Linux关闭防火墙
- 解决SharePoint2013产品过期问题
- Nginx在安装过程经常出现的问题
- bzoj 1015: [JSOI2008]星球大战starwar
- imooc movie
- iOS开发--xcode快捷键
- iOS打电话
- STP协议的形象化理解
- iOS开发之首次启动引导页的两种处理方法简析
- JavaScript实现斗地主游戏的思路
- EditText监听方法以及关闭软键盘
- const的用法详解
- SVN切换账号(TortoiseSVN+IDE)
- 扫描线算法
- iOS开发笔记--xcode7安装Alcatraz插件管理器
- 跳跃表-随机化数据结构
- iOS/mac开发的一些知名个人博客
- 为什么学习linux,知乎转载
- Android使用BitmapFactory.Options解决加载大图片内存溢出问题
- Java快速排序