OpenVINOTM,给你看得见的未来!>>
电子产品世界 » 论坛首页 » 嵌入式开发 » STM32 » 游程编码问题

共3条 1/1 1 跳转至

游程编码问题

高工
2018-05-08 13:34:48    评分

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




管理员
2018-05-09 08:24:52    评分
2楼

谢谢楼主分享    楼主多注意代码对其规范奥


菜鸟
2018-05-09 08:38:37    评分
3楼

看着略窜行。。。


共3条 1/1 1 跳转至

回复

匿名不能发帖!请先 [ 登陆 注册 ]