zoukankan      html  css  js  c++  java
  • 游程编码问题

    游程编码问题
    请实现游程编码的编码函数和解码函数。
    提示:游程编码的概念是,
    给一块数据,如: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:
    ");
    17     for(i=0;i<num;i++)
    18     {
    19         printf(" 0x%x",buf[i]);
    20     }
    21     printf("
    ");
    22 
    23     unsigned char *cod_data;        //定义一个接收编码的空间
    24     cod_data=coding(buf,&num);        //调用编码函数
    25 
    26     //打印编码
    27     printf("After the coding is:
    ");
    28     for(i=0;i<num;i++)
    29     {
    30         printf(" 0x%x",cod_data[i]);
    31     }
    32     printf("
    ");
    33     
    34    //解码动作
    35     unsigned char *decode_data;      //定义一个接收解码的空间
    36     decode_data = de_data(cod_data,&num);    //调用解码函数
    37 
    38    //打印解码    
    39     printf("After decoding is:
    ");
    40     for(i=0;i<num;i++)
    41     {
    42         printf(" 0x%x",decode_data[i]);
    43     }
    44     printf("
    ");
    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;
    }
  • 相关阅读:
    PHP小技巧
    PHP Ajax跨域解决
    单点登录
    Linux 常用命令
    php面向对象--继承
    vueDemo
    vueSource
    vuex
    Vue.js
    关于前后端分离
  • 原文地址:https://www.cnblogs.com/eeexu123/p/5226893.html
Copyright © 2011-2022 走看看