题目1
方法1:
char data[] = {
0x00,0x01,0x02,0x03,0x04,0x05,0x06,0x07,0x07,0x09,
0x00,0x20,0x10,0x03,0x03,0x0C,0x00,0x00,0x44,0x00,
0x00,0x33,0x00,0x47,0x0C,0x0E,0x00,0x0D,0x00,0x11,
0x00,0x00,0x00,0x02,0x64,0x00,0x00,0x00,0xAA,0x00,
0x00,0x00,0x64,0x10,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x02,0x00,0x74,0x0F,0x41,0x00,0x00,0x00,
0x01,0x00,0x00,0x00,0x05,0x00,0x00,0x00,0x0A,0x00,
0x00,0x02,0x74,0x0F,0x41,0x00,0x06,0x08,0x00,0x00,
0x00,0x00,0x00,0x64,0x00,0x0F,0x00,0x00,0x0D,0x00,
0x00,0x00,0x23,0x00,0x00,0x64,0x00,0x00,0x64,0x00
};
// 注意memory中小端存储
void search_fun(int type,int num)
{
char* start = data;
int length = sizeof(data)/sizeof(data[0]);
int i = 0;
while(i<=length-type) // 例如Type=4 ,四个字节查询一次就行(4-4),五个字节需要查询两次(5-4)注意是小于号
{
if(type==4)
{
if(num==*(int*)&data[i])
{
printf("type = 4 address:%x data:%d\n",&data[i],int(num)); //必须写int(num),而不是data[i](它不是int型)
}
}
else if(type==2)
{
if(num == *(short*)&data[i]) //(short*)&data[i] 将&data[i]的地址强制转化为short型的,实现一个挨着一字节地查询
{
printf("type = 2 address:%x data:%d\n",&data[i],short(num));
}
}
else
{
if(num == *(char*)&data[i])
{
printf("type = 1 address:%x data:%d\n",&data[i],char(num));
}
}
i++;
}
}
int main(int argc, char* argv[])
{
printf("data start from:%x\n",data);
search_fun(4,100);
getchar();
return 0;
}
方法2:
char data[] = {
0x00,0x01,0x02,0x03,0x04,0x05,0x06,0x07,0x07,0x09,
0x00,0x20,0x10,0x03,0x03,0x0C,0x00,0x00,0x44,0x00,
0x00,0x33,0x00,0x47,0x0C,0x0E,0x00,0x0D,0x00,0x11,
0x00,0x00,0x00,0x02,0x64,0x00,0x00,0x00,0xAA,0x00,
0x00,0x00,0x64,0x10,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x02,0x00,0x74,0x0F,0x41,0x00,0x00,0x00,
0x01,0x00,0x00,0x00,0x05,0x00,0x00,0x00,0x0A,0x00,
0x00,0x02,0x74,0x0F,0x41,0x00,0x06,0x08,0x00,0x00,
0x00,0x00,0x00,0x64,0x00,0x0F,0x00,0x00,0x0D,0x00,
0x00,0x00,0x23,0x00,0x00,0x64,0x00,0x00,0x64,0x00
};
// 注意memory中小端存储
void search_type_4(int num, int length)
{
int i = 0;
while(i<=length-4)
{
if(num == *(int*)&data[i])
{
printf("type = 4 address:%x data:%d\n",&data[i],int(num));
}
i++;
}
}
void search_type_2(int num,int length)
{
int i = 0;
while(i<=length-2)
{
if(num == *(short*)&data[i])
{
printf("type = 2 address:%x data:%d\n",&data[i],short(num));
}
i++;
}
}
void search_type_1(int num ,int length)
{
int i = 0;
while(i<=length-1)
{
if(num == *(char*)&data[i])
{
printf("type = 1 address:%x data:%d\n",&data[i],char(num));
}
i++;
}
}
void search_fun(int type ,int num)
{
int length = sizeof(data)/sizeof(data[0]);
// int i = 0;
typedef void (*funcptr)(int,int);
funcptr p;
if(type == 4)
{
p = search_type_4;
}
else if(type == 2)
{
p = search_type_2;
}
else
{
p = search_type_1;
}
p(num,length);
}
int main(int argc, char* argv[])
{
printf("data start from:%x\n",data);
search_fun(1,100);
getchar();
return 0;
}
题目2
1.
char data[]=
{
0x00,0x01,0x02,0x03,0x04,0x05,0x06,0x07,0x07,0x09,
0x00,0x20,0x10,0x03,0x03,0x0C,0x00,0x00,0x44,0x00,
0x00,0x33,0x00,0x47,0x0C,0x0E,0x00,0x0D,0x00,0x11,
0x00,0x00,0x00,0x02,0x64,0x00,0x00,0x00,0xAA,0x00,
0x00,0x00,0x64,0x10,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x02,0x00,0x74,0x0F,0x41,0x00,0x00,0x00,
0x01,0x00,0x00,0x00,0x05,0x00,0x00,0x00,0x0A,0x00,
0x00,0x02,0x57,0x4F,0x57,0x00,0x06,0x08,0x00,0x00,
0x00,0x00,0x00,0x64,0x00,0x0F,0x00,0x00,0x0D,0x00,
0x00,0x00,0x23,0x00,0x00,0x64,0x00,0x00,0x64,0x00
};
char* find_role_name(char* pData,char* name)
{
int data_size = sizeof(data)/sizeof(data[0]);
int name_len = strlen(name);
int i=0;
for(;i<data_size-name_len;i++)
{
if(strncmp(&pData[i],name,name_len)==0)
{
return &pData[i];
break;
}
}
return NULL;
}
/*
strncmp函数为字符串比较函数,字符串大小的比较是以ASCII 码表上的顺序来决定,
此顺序亦为字符的值。其函数声明为int strncmp ( const char * str1, const char * str2, size_t n );
功能是把 str1 和 str2 进行比较,最多比较前 n 个字节,若str1与str2的前n个字符相同,则返回0;
若s1大于s2,则返回大于0的值;若s1 小于s2,则返回小于0的值。
*/
int main(int argc, char* argv[])
{
char * result_addr = find_role_name(data,"WOW");
if(result_addr!= NULL)
{
printf("地址为:%p",result_addr); // %p是专门用来打印指针的值、地址。系统的寻址范围为取值范围。与%x不同,它是输出一个无符号的的16进制的表达形式
}
else
{
printf("not found!");
}
getchar();
return 0;
}
char data[]=
{
0x00,0x01,0x02,0x03,0x04,0x05,0x06,0x07,0x07,0x09,
0x00,0x20,0x10,0x03,0x03,0x0C,0x00,0x00,0x44,0x00,
0x00,0x33,0x00,0x47,0x0C,0x0E,0x00,0x0D,0x00,0x11,
0x00,0x00,0x00,0x02,0x64,0x00,0x00,0x00,0xAA,0x00,
0x00,0x00,0x64,0x10,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x02,0x00,0x74,0x0F,0x41,0x00,0x00,0x00,
0x01,0x00,0x00,0x00,0x05,0x00,0x00,0x00,0x0A,0x00,
0x00,0x02,0x57,0x4F,0x57,0x00,0x06,0x08,0x00,0x00,
0x00,0x00,0x00,0x64,0x00,0x0F,0x00,0x00,0x0D,0x00,
0x00,0x00,0x23,0x00,0x00,0x64,0x00,0x00,0x64,0x00
};
void print_role_name(char* pData)
{
int data_size = sizeof(data)/sizeof(data[0]);
int i =0;
for(;i<data_size-4;i++)
{
for(int j = 0;j<4;j++)
{
printf("%c",pData[i+j]);
}
printf("\t");
}
}
int main(int argc, char* argv[])
{
print_role_name(data);
getchar();
return 0;
}
补充:字符串做函数参数,退化为指针
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
//字符串做函数参数,退化为指针
//字符串copy,str1 拷贝到 str2;
int copy_str(char *from, char *to )
{
int ret = 0;
if (from == NULL || to == NULL)
{
ret = - 1;
return ret;
}
printf("from:%s \n", from);
char *tmpfrom = NULL;
char *tmpto = NULL;
tmpfrom = from;
tmpto = to;
//form形参 形参to 的值 不停的在变化....
//不断的修改了myfrom和myto的指向
while (*tmpto++ = *tmpfrom++) //*操作 和++的操作; ++ 优先级高 // 后置++,先 *to = *from; 再from++, to++
{
;
}
return ret;
}
int main()
{
int ret = 0;
char *from = "abcd";
char to[100];
copy_str(from, to);
printf("to:%s \n", to);
system("pause");
return 0;
}
题目3
typedef struct TagPlayer
{
int id;
int level;
}Player;
char a[]={
0x00,0x01,0x02,0x03,0x04,0x05,0x06,0x07,0x07,0x09,
0x00,0x20,0x10,0x03,0x03,0x0C,0x00,0x00,0x44,0x00,
0x00,0x33,0x01,0x00,0x00,0x08,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x02,0x64,0x00,0x00,0x00,0xAA,0x00,
0x00,0x00,0x64,0x01,0x00,0x00,0x00,0x08,0x00,0x00,
0x00,0x00,0x02,0x00,0x74,0x0F,0x41,0x00,0x00,0x00,
0x01,0x00,0x00,0x00,0x05,0x00,0x00,0x00,0x0A,0x00,
0x00,0x02,0x57,0x4F,0x57,0x00,0x06,0x08,0x00,0x00,
0x00,0x00,0x00,0x64,0x00,0x0F,0x00,0x00,0x0D,0x00,
0x00,0x00,0x23,0x00,0x00,0x64,0x00,0x00,0x64,0x00
};
int fun_found(struct TagPlayer* splayer)
{
int nsum = 0; // 初始化一个计数器
for(int i =0;i<sizeof(a)-sizeof(*splayer);i++) //挨个循环
{
splayer = (Player*)&a[i]; // 强转
if(splayer->id==1 && splayer->level==8)
{
nsum++;
}
}
return nsum;
}
int main(int argc, char* argv[])
{
Player* splayer; // 实例化一个结构体指针
int num = fun_found(splayer); // 将结构体指针作为参数传入
printf("结构体个数为:%d\n",num);
getchar();
return 0;
}