游程编码问题
请实现游程编码的编码函数和解码函数。
提示:游程编码的概念是,
给一块数据,如: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;
}
我要赚赏金
