指针的类型可以是一种结构体,结构体可以说是C的精华之一。程序员可以根据业务的需要自己设计数据类型。这在程序设计上提供了很大方便。我对结构体指针的认识。我们设计一种协议报文格式如下:
这种报文与电力系统的104协议比较类似。这是我一个同学公司使用的一种报文形式。现在我们按照这个报文格式来分析一下。
首先第一个字节0x68是报文开头。第二个字节是报文长度。根据这个字节可以判断报文结束。紧接着四个字节是协议控制字。类型码固定为0,无序。数据数量报文中数据个数。后面的是数据内容。格式为一个地址一个数据数据。我们按照这个报文写一组数据。
0x68
0x1B
0x01 0x02
0x03 0x04
0x00
0x01
0x05
0x20 0x00 0x11 0x22
0x20 0x01 0x12 0x23
0x20 0x02 0x12 0x23
0x20 0x03 0x11 0x24
0x20 0x04 0x16 0x62
我们如果要分析这段数据,怎样效率最高?这是好几年前的事情。他们公司代码我已经找不到。但是我们自己可以 试着写一段代码来实现协议的解析。
#include
typedef struct MESSAGE_HEAD
{
unsigned char head;
unsigned char len;
unsigned short int sedNum;
unsigned short int recNUm;
unsigned char type;
unsigned char becau;
unsigned char datNumber;
} MESSAGE_HEAD;
typedef struct DAT_FORMAT
{
unsigned short int add;
unsigned short int dat;
}DAT_FORMAT;
unsigned char mes[]={ 0x68,
0x1B,
0x01,0x02,
0x03,0x04,
0x00,
0x01,
0x05,
0x20,0x00, 0x11,0x22,
0x20,0x01, 0x12,0x23,
0x20,0x02, 0x12,0x23,
0x20,0x03, 0x11,0x24,
0x20,0x04, 0x16,0x62
};
int main(void)
{
unsigned char i;
MESSAGE_HEAD *pMessage;
DAT_FORMAT *PaddDat;
unsigned char *pUnchar;
pMessage=mes;
printf("head=0x%02x\n",pMessage->head);
printf("len=0x%02x\n", pMessage->len);
printf("sedNum=0x%04x\n", pMessage->sedNum);
printf("recNUm=0x%04x\n", pMessage->recNUm);
printf("type=0x%02x\n", pMessage->type);
printf("becau=0x%02x\n", pMessage->becau);
printf("datNumber=0x%02x\n", pMessage->datNumber);
pUnchar = pMessage;
pUnchar += sizeof(MESSAGE_HEAD);
pUnchar -=1;
PaddDat = pUnchar;
for(i=0;idatNumber;i++)
{
printf("地址 0x%04x, 数据 0x%04x\n",PaddDat->add,PaddDat->dat);
PaddDat++;
}
}
以上代码在VC中运行结果是:
这一节我们介绍了结构体指针简单使用方法。结构体指针在协议分析是非常方便。有时候我觉得这里大概可以解释“程序是数据加方法”吧!!