游程编码问题
请实现游程编码的编码函数和解码函数。
提示:游程编码的概念是,
给一块数据,如:0x11 0x11 0x11 0x22 0x33 0x33 0x33 0x33 0x33,
那么游程编码的结果是:0x11 0x3 0x22 0x1 0x33 0x5
//主函数
1 #include <stdio.h> 2 3 //函数声明 4 extern void *coding(void *string,int *num); //编码函数 5 extern void *de_data(void *string,int *num); //解码函数 6 7 int main() 8 { 9 //编码动作 10 int num,i=0; 11 12 unsigned char buf[]={0x11,0x11,0x11,0x22,0x33,0x33,0x33,0x33,0x33}; 13 num = sizeof(buf)/sizeof(buf[0]); 14 15 //打印原码 16 printf("The original code is:\n"); 17 for(i=0;i<num;i++) 18 { 19 printf(" 0x%x",buf[i]); 20 } 21 printf("\n"); 22 23 unsigned char *cod_data; //定义一个接收编码的空间 24 cod_data=coding(buf,&num); //调用编码函数 25 26 //打印编码 27 printf("After the coding is:\n"); 28 for(i=0;i<num;i++) 29 { 30 printf(" 0x%x",cod_data[i]); 31 } 32 printf("\n"); 33 34 //解码动作 35 unsigned char *decode_data; //定义一个接收解码的空间 36 decode_data = de_data(cod_data,&num); //调用解码函数 37 38 //打印解码 39 printf("After decoding is:\n"); 40 for(i=0;i<num;i++) 41 { 42 printf(" 0x%x",decode_data[i]); 43 } 44 printf("\n"); 45 46 free(cod_data); 47 free(decode_data); 48 49 return 0; 50 }
//加码动作
1 #include<stdio.h> 2 #include<stdlib.h> 3 /************************************************************************* 4 read_len:原码长度 5 count:1,原码中不相等值的个数 2,计算原码中相邻相等值的个数 6 teamdata:临时存放空间 7 read_data:指向原码空间 8 cod_data:指向编码空间 9 **************************************************************************/ 10 11 void *coding(void *string,int *num) 12 { 13 int i=1,count=1; 14 int read_len; 15 unsigned char *read_data = (unsigned char *)string; 16 read_len = *num; 17 unsigned char teamdata; 18 unsigned char *code_data; 19 20 if(read_data == NULL) 21 { 22 return NULL; 23 } 24 25 //计算编码后所需要的空间的大小 26 teamdata = read_data[0]; 27 for(i=1;i<read_len;i++) 28 { 29 if(teamdata != read_data[i]) 30 { 31 count++; 32 teamdata = read_data[i]; 33 } 34 } 35 36 code_data = (unsigned char *)malloc(count*2); 37 38 if(code_data == NULL) 39 { 40 return NULL; 41 } 42 43 *num = count*2; //将原码长度指向编码后的长度 44 count = 1; 45 int code_len = 0; 46 47 //编码动作 48 code_data[code_len++]=read_data[0]; 49 teamdata = read_data[0]; 50 for(i=1;i<read_len;i++) 51 { 52 if(teamdata != read_data[i]) 53 { 54 code_data[code_len++] = count; 55 code_data[code_len++] = read_data[i]; 56 teamdata = read_data[i]; 57 count = 1; 58 continue; 59 } 60 else 61 { 62 count++; 63 } 64 code_data[code_len] = count; 65 } 66 67 //下面我用code_data两次一个循环来保存编码后的值,也可以实现成功编码, 68 69 /* 70 i = 0; 71 for(i=0;i<read_len;i++) 72 { 73 if(read_data[i+1] != read_data[i]) 74 { 75 code_data[code_len] = read_data[i]; 76 code_data[code_len+1] = count; 77 code_len = code_len + 2; 78 count = 1; 79 } 80 else 81 { 82 count++; 83 } 84 } 85 */ 86 return code_data; 87 }
//解码动作
#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; }