您的位置:首页 > 其它

游程编码问题

2016-02-29 11:25 453 查看
游程编码问题
请实现游程编码的编码函数和解码函数。
提示:游程编码的概念是,
给一块数据,如:0x11 0x11 0x11 0x22 0x33 0x33 0x33 0x33 0x33,
那么游程编码的结果是:0x11 0x3 0x22 0x1 0x33 0x5

//主函数

#include <stdio.h>

//函数声明
extern void *coding(void *string,int *num);            //编码函数
extern void *de_data(void *string,int *num);        //解码函数

int main()
{
//编码动作
int num,i=0;

unsigned char buf[]={0x11,0x11,0x11,0x22,0x33,0x33,0x33,0x33,0x33};
num = sizeof(buf)/sizeof(buf[0]);

//打印原码
printf("The original code is:\n");
for(i=0;i<num;i++)
{
printf(" 0x%x",buf[i]);
}
printf("\n");

unsigned char *cod_data;        //定义一个接收编码的空间
cod_data=coding(buf,&num);        //调用编码函数

//打印编码
printf("After the coding is:\n");
for(i=0;i<num;i++)
{
printf(" 0x%x",cod_data[i]);
}
printf("\n");

//解码动作
unsigned char *decode_data;      //定义一个接收解码的空间
decode_data = de_data(cod_data,&num);    //调用解码函数

//打印解码
printf("After decoding is:\n");
for(i=0;i<num;i++)
{
printf(" 0x%x",decode_data[i]);
}
printf("\n");

free(cod_data);
free(decode_data);

return 0;
}


//加码动作

#include<stdio.h>
#include<stdlib.h>
/*************************************************************************
read_len:原码长度
count:1,原码中不相等值的个数 2,计算原码中相邻相等值的个数
teamdata:临时存放空间
read_data:指向原码空间
cod_data:指向编码空间
**************************************************************************/

void *coding(void *string,int *num)
{
int i=1,count=1;
int read_len;
unsigned char *read_data = (unsigned char *)string;
read_len = *num;
unsigned char teamdata;
unsigned char *code_data;

if(read_data == NULL)
{
return NULL;
}

//计算编码后所需要的空间的大小
teamdata = read_data[0];
for(i=1;i<read_len;i++)
{
if(teamdata != read_data[i])
{
count++;
teamdata = read_data[i];
}
}

code_data = (unsigned char *)malloc(count*2);

if(code_data == NULL)
{
return NULL;
}

*num = count*2;            //将原码长度指向编码后的长度
count = 1;
int code_len = 0;

//编码动作
code_data[code_len++]=read_data[0];
teamdata = read_data[0];
for(i=1;i<read_len;i++)
{
if(teamdata != read_data[i])
{
code_data[code_len++] = count;
code_data[code_len++] = read_data[i];
teamdata = read_data[i];
count = 1;
continue;
}
else
{
count++;
}
code_data[code_len] = count;
}

//下面我用code_data两次一个循环来保存编码后的值,也可以实现成功编码,

/*
i = 0;
for(i=0;i<read_len;i++)
{
if(read_data[i+1] != read_data[i])
{
code_data[code_len] = read_data[i];
code_data[code_len+1] = count;
code_len = code_len + 2;
count = 1;
}
else
{
count++;
}
}
*/
return code_data;
}


//解码动作

#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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: