給出一段數據流,如
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();
}