给出一段数据流,如
7e7e7e020301067e7e7e0301010106
帧头为等于或大于3个7e7e7e 则后面为有效报文,
紧接着1个字节为报文长度,报文长度n有效范围 【1,64】
之后为连续n个字节的报文内容,
报文内容之后一个字节为报文校验位check。只有报文内容+报文长度 = 报文校验位 则报文有效否则为无效,丢弃。从下一个字节开始找新的帧头。
如果当中也出现无效报文,则从下一个字节找新的帧头。
简单实现以下,回头封装函数,优化代码。
#define MALLOC_ERR -1
//7e7e7e020301067e7e7e0301010106
int get_valid_data(char *str, int length)
{
char *data_stream = str;
int str_len = length;
char *cur_pos = data_stream;
int pk_head_len = 0;
int pk_length = 0;
char *pk_data = NULL;
char pk_checksum = 0;
int i,j;
while(str_len > 0)
{
while(*cur_pos == 0x7e)
{
cur_pos++;
pk_head_len++;
}
if(pk_head_len < 3)
{
str_len -= pk_head_len;
pk_head_len = 0;
continue;
}
pk_length = *cur_pos;
cur_pos++;
if(pk_length >= 1 && pk_length <= 64)
{
pk_data = (char *)malloc(pk_length);
if(pk_data == NULL)
{
return MALLOC_ERR;
}
else
{
memcpy(pk_data, cur_pos, pk_length);
cur_pos += pk_length;
}
pk_checksum = pk_length;
for(i = 0; i < pk_length; i++)
{
pk_checksum += pk_data[i];
}
if(pk_checksum == *cur_pos)
{
for(j = 0; j < pk_length; j++)
{
printf("%x ", pk_data[j]);
}
printf("\n");
free(pk_data);
pk_data = NULL;
cur_pos++;
}
else
{
cur_pos++;
str_len -= pk_head_len + 1 + pk_length + 1;
free(pk_data);
pk_data = NULL;
pk_head_len = 0;
continue;
}
}
else
{
str_len -= pk_head_len + 1;
pk_head_len = 0;
continue;
}
}
}
int main()
{
char stream[] = {0x7e,0x7e,0x7e,0x02,0x03,0x01,0x06,0x7e,0x7e,0x7e,0x03,0x01,0x01,0x01,0x06};
get_valid_data(stream, sizeof(stream));
getchar();
}