OJ練習1

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


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章