题目
给定一串数据,如:
0x11,0x22,0x11,0x11,0x11,0x34,0x34,0x22
编码后,得到:
0x11,0x01,0x22,0x01,0x11,0x03,0x34,0x02,0x22,0x01
数据分析
显然在给定的这一组数据中,他们都是占一个字节的字符型数据。所以我们肯定是要用数组来存储。同时我们要输出的数据也应该采用数组打印的方式来输出我们的结果
核心思想
在写的过程中时刻提问自己
- 我操作的对象是什么?(即数据的类型,大小)
- 分配的内存空间在那个段?(栈,堆,data(初始化,未初始化),常量)
- 处理后在内存中的位置
完整代码
下面展示一些 内联代码片
。
#include<stdio.h>
#include <stdlib.h>//malloc函数需要引用该头文件
void *shifang(void *space){//用完以后我们要释放我们在堆上申请的空间
free(space);
}
void *encoding(const void *raw,int *num){//函数声明,我们要想清楚,我们需要的到的是什么,我们要得到这个结果,需要外界给我们提供什么
unsigned char *data=(unsigned char *)raw; //因为上面我们定义的是 void类型,所以这里需要我们进行强制转换一下类型。
unsigned char *result=NULL;//我们定义我们的返回结果,因为函数是在栈里面的,所以为了在函数结束后我们还能找到结果,我们需要将它放在堆里。
//第一步,我们要找到result的长度,我们才能将结果存放在堆内
int tmp=*num;
unsigned char s=data[0];
int count=1;
for (int i = 1; i <tmp ; ++i) {
if (data[i]!=s){
count++;
s=data[i];
}
}
result=(char *)malloc(count*2);
printf("This result length is %d\n",count*2);//这里可以检验一下我们是不是有错
if (result==NULL){//检验堆内存分配是否成功
printf("error!\n");
}
*num=count*2;//反向更新,将我们的result长度返回到main中的length去。类比scanf函数
//进行数据的填充
int foo=1;//用来帮助我们记录result的位置
count=1;
result[0]=data[0];
s=data[0];
for (int j = 1; j <tmp ; ++j) {
if (data[j]!=s){
result[foo]=count;
foo++;
count=1;//置1重新计数
result[foo]=data[j];
foo++;
s=data[j];
} else{
count++;
}
}
//进行收尾的处理
result[foo]=count;
return result;
}
int main(){
//存储我们的数据
char raw_data[]={0x11, 0x11, 0x11, 0x11, 0x22, 0x22, 0x11, 0x11};
char *result;//声明我们的结果
//调用函数
int length=sizeof(raw_data)/sizeof(raw_data[0]);
result=encoding(raw_data,&length);
if (result==NULL){//检验机制
printf("error!\n");
return -1;
}
for (int i = 0; i <length ; ++i) {//结果的显示,显然我们需要打印的长度,这个长度我们需要依靠函数告知,所以采用反向更新的思想
printf("0x%x\t",result[i]);
}
printf("\n");
shifang(result);
return 0;
}