游程编码问题

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了游程编码问题相关的知识,希望对你有一定的参考价值。

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

 

以上是关于游程编码问题的主要内容,如果未能解决你的问题,请参考以下文章

求:C语言的游程编码,要求将大量的二进制的数据压缩

二值信息隐藏(分块和游程编码实现)

模式游程编码

算法科普:有趣的游程编码

连续对数运算:游程编码项上的下限运算符

算法题:RLE压缩算法(游程编码)的Java实现