cat 021 解析

cat 021 解析

https://blog.csdn.net/qingfengleerge/article/details/81102854#commentBox 代碼改了下,不依賴vs,去掉windows.h頭文件,只使用c++標準庫,使得代碼可以直接使用gcc編譯。

代碼如下:

// cat021_test_1.cpp : 定義控制檯應用程序的入口點。
//使用C++對網絡數據包進行解析
//解析cat021(V0.26版)報文——C++


#include <cmath>
#include <iostream>
#include <fstream>
#include <vector>
#include <list>
#include <iomanip>
#include <algorithm>

typedef unsigned char BYTE;

using std::cout;
using std::endl;
using std::vector;
using std::list;
using std::string;


class DatagramUap
{
private:
	int frn, len;
	string dataitemname;//數據名
	string dataitemNum;//數據編號
	vector<BYTE> databytes;  //解析之後每個數據項對應的字節—存放處(容器)
public:
	void setFrn(int value3)
	{
		frn = value3;
	}
	int getfrn() { return frn; }

	void setLen(int value4)
	{
		len = value4;
	}
	int getLen() { return len; }

	void setDataitemname(string value5)
	{
		dataitemname = value5;
	}
	string& getDataitemname() { return dataitemname; }

	void setDataitemNum(string value6)
	{
		dataitemNum = value6;
	}
	string& getDataitemNum() { return dataitemNum; }

	void setDatabytes(vector<BYTE> value)
	{
		databytes = value;
	}
	vector<BYTE> getDatabytes()
	{
		return databytes;
	}
};


class DataBlock
{
private:
	int cat, len;
	list<DatagramUap> dataitem;

public:
	void setCat(int value1)
	{
		cat = value1;		
	}
	int getCat() { return cat; }
	void setLen(int value2)
	{
		len = value2;
	}
	int getLen(){ return len; }
	
	void setDataitem(list<DatagramUap> vl)
	{
		dataitem = vl;
	}
	list<DatagramUap> getDataitem() { return dataitem; }
};


//系列函數(function)
//計算數據項的值
//系列函數(function)


//計算數據源識別項(1021/010)對應的值
int DataSourceIdentifiction(vector<BYTE> lhs)
{
	int temp0, temp1;
	temp0 = lhs[0];
	temp1 = lhs[1];
	cout << "SAC:" << temp0 << ";";
	cout << "SIC:" << temp1 << endl << endl;
	return 0;
}

//計算髮射體類型項(1021/020)對應的值
int EmitterCategory(vector<BYTE> lhs)
{
	int rhs;
	rhs = lhs[0];
	if (rhs == 0)
	{
		cout << "EMITTER:未知" << endl<<endl;
	}
	else if (rhs == 1||rhs==12)
	{
		cout << "EMITTER:輕型飛機" << endl<<endl;
	}
	else if (rhs == 3)
	{
		cout << "EMITTER:中型飛機" << endl<<endl;
	}
	else if (rhs == 5)
	{
		cout << "EMITTER:重型飛機" << endl<<endl;
	}
	else if (rhs == 6)
	{
		cout << "EMITTER:高機動及高速飛機" << endl<<endl;
	}
	else if (rhs == 10)
	{
		cout << "EMITTER:旋翼飛機" << endl<<endl;
	}
	else if (rhs == 11)
	{
		cout << "EMITTER:滑翔機" << endl<<endl;
	}
	else if (rhs == 13)
	{
		cout << "EMITTER:無人機" << endl<<endl;
	}
	else if (rhs == 14)
	{
		cout << "EMITTER:太空飛行器 /穿越大氣層的飛行器" << endl<<endl;
	}
	else if (rhs == 15)
	{
		cout << "EMITTER:超輕型飛機 /手持式滑翔機 /滑翔傘" << endl<<endl;
	}
	else if (rhs == 16)
	{
		cout << "EMITTER:傘兵/跳傘運動員" << endl<<endl;
	}
	else if (rhs == 20)
	{
		cout << "EMITTER:地面應急車輛" << endl<<endl;
	}
	else if (rhs == 21)
	{
		cout << "EMITTER:地面服務車輛" << endl<<endl;
	}
	else if (rhs == 22)
	{
		cout << "EMITTER:固定的地面或繫留障礙物" << endl<<endl;
	}

	return 0;
}


//計算日時間項(1021/030)對應的值
int TimeOfDay(vector<BYTE> lhs)
{
	int rhs;
	rhs = ((unsigned int)lhs[0] << 16) + ((unsigned int)lhs[1] << 8) + (unsigned int)lhs[2];//將幾個獨立字節合併爲一個字節
	int value0 = rhs / 128;//總秒數
	int value1 = value0 / 3600;//小時數
	int value2 = (value0 - value1 * 3600) / 60;//分鐘數
	int value3 = (value0 - value1 * 3600) % 60;//秒數
	int value4 = ((rhs % 128)*1000)/128;//毫秒數
	cout << "TOD:" << value1 << ":" << value2 << ":" << value3 << "." << value4 << endl<<endl;
	return 0;
}

//計算日時間精確度項(1021/032)對應的值
int TimeofDayAccuracy(vector<BYTE> lhs)
{
	int rhs;
	rhs = lhs[0];
	double value0 = pow(2, -8);
	double value1 = rhs*value0;
	cout << "TODA:" << std::setiosflags(std::ios::fixed) << std:: setprecision(6) << value1 << endl << endl;//以小數點後6位的形式輸出
	return 0;
}


//計算目標報告描述符項(1021/040)對應的值
int Target(vector<BYTE> lhs)
{
	int rhs;
	rhs = ((unsigned int)lhs[0] << 8) + (unsigned int)lhs[1];
	//判斷字節(二進制數)中具體某位的值(1或者0)
	int value0 = (rhs >> 15) & 1;//判斷第15位
	if (value0 == 1)
	{
		cout << "DCR:微分修正" << ";";
	}
	else
	{
		cout << "DCR:無微分修正" << ";";
	}
	int value1 = (rhs >> 14) & 1;//判斷第14位
	if (value1 == 1)
	{
		cout << "GBS:已設接地位" << ";";
	}
	else
	{
		cout << "GBS:未設接地位" << ";";
	}
	int value2 = (rhs >> 13) & 1;//判斷第13位
	if (value2 == 1)
	{
		cout << "SIM:模擬目標報告" << ";";
	}
	else
	{
		cout << "SIM:實際目標報告" << ";";
	}
	int value3 = (rhs >> 12) & 1;//判斷第12位
	if (value3 == 1)
	{
		cout << "TST:測試目標" << ";";
	}
	else
	{
		cout << "TST:默認" << ";";
	}
	int value4 = (rhs >> 11) & 1;//判斷第11位
	if (value4 == 1)
	{
		cout << "RAB:來自現場監視器的報告" << ";";
	}
	else
	{
		cout << "RAB:來自目標應答機的報告" << ";";
	}
	int value5 = (rhs >> 10) & 1;//判斷第10位
	if (value5 == 1)
	{
		cout << "SAA:設備能夠提供選定高度" << ";";
	}
	else
	{
		cout << "SAA:設備不能提供選定高度" << ";";
	}
	int value6 = (rhs >> 9) & 1;//判斷第9位
	if (value6 == 1)
	{
		cout << "SPA:特殊位置識別" << ";";
	}
	else
	{
		cout << "SPA:SPA不存在" << ";";
	}
	int value7 = (rhs >> 5) & 7;//取出第5~7位並判斷第5-7位
	if (value7 == 0)
	{
		cout << "ATP:非唯一地址" << ";";
	}
	else if (value7 == 1)
	{
		cout << "ATP:24位ICAO地址" << ";";
	}
	else if (value7 == 2)
	{
		cout << "ATP:地面車輛地址" << ";";
	}
	else if (value7 == 3)
	{
		cout << "ATP:匿名地址" << ";";
	}
	else if ((value7 == 4) || (value7 == 5) || (value7 == 6) || (value7 == 7))
	{
		cout << "ATP:爲將來的地址而預留" << ";";
	}
	int value8 = (rhs >> 3) & 3;//取出第3~4位並判斷第3~4位
	if (value8 == 0)
	{
		cout << "ARC(高度報告能力):未知" << endl<<endl;
	}
	else if (value8 == 1)
	{
		cout << "ARC(高度報告能力):25英尺" << endl<<endl;
	}
	else if (value8 == 2)
	{
		cout << "ARC(高度報告能力):100英尺" << endl<<endl;
	}
	return 0;
}


//計算以8進製表示的3/A碼項(1021/070)對應的值
int Mode3_ACodeinOctalRepresentation(vector<BYTE> lhs)
{
	int rhs;
	rhs = ((unsigned int)lhs[0] << 8) + (unsigned int)lhs[1];//合併字節
	int value0 = (rhs >> 9) & 7;//取出第9~11位
	int value1 = (rhs >> 6) & 7;//取出第6~8位
	int value2 = (rhs >> 3) & 7;//取出第3~5位
	int value3 = rhs & 7;//取出第0~2位
	cout << "MODE_3/A:" << std::oct << value0 << value1 << value2 << value3 << ";";//以八進制的形式輸出
	int value4 = (rhs >> 15) & 1;//取出第15位;
	if (value4 == 1)
	{
		cout << "代碼未驗證" << ";";
	}
	else
	{
		cout << "代碼驗證" << ";";
	}
	int value5 = (rhs >> 14) & 1;//取出第14位
	if (value5 == 1)
	{
		cout << "存在亂碼" << ";";
	}
	else
	{
		cout << "默認" << ";";
	}
	int value6 = (rhs >> 13) & 1;//取出第13位
	if (value6 == 1)
	{
		cout << "Mode-3/A在上次更新中未提取" << endl << endl;
	}
	else
	{
		cout << "Mode-3/A在上次更新中獲取" << endl << endl;
	}

	return 0;
}





//計算目標地址項(1021/080)對應的值
int TargetAddress(vector<BYTE> lhs)
{
	int rhs;
	rhs=((unsigned int)lhs[0] << 16) + ((unsigned int)lhs[1] << 8) + (unsigned int)lhs[2];
	cout << "ADDR:" << std::hex << rhs << endl<<endl;//以16進制輸出rhs
	return 0;
}

//計算品質因數項(1021/090)對應的值
int FigureOfMerit(vector<BYTE> lhs)
{
	int rhs;
	rhs = ((unsigned int)lhs[0] << 8) + (unsigned int)lhs[1];
	int value0 = (rhs >> 14) & 3;//取出第14~15位並判斷第14-15位值
	if (value0 == 0)
	{
		cout << "AC:未知" << ";";
	}
	else if (value0 == 1)
	{
		cout << "AC:ACAS不可使用" << ";";
	}
	else if (value0 == 2)
	{
		cout << "AC:ACAS可供使用" << ";";
	}
	else if (value0 == 3)
	{
		cout << "AC:無效" << ";";
	}
	int value1 = (rhs >> 12) & 3;//取出第12~13位並判斷第12~13位值
	if (value1 == 0)
	{
		cout << "MN:未知" << ";";
	}
	else if (value1 == 1)
	{
		cout << "MN:多個導航設備未處於工作狀態" << ";";
	}
	else if (value1 == 2)
	{
		cout << "MN:多個導航設備處於工作狀態" << ";";
	}
	else if (value1 == 3)
	{
		cout << "MN:無效" << ";";
	}
	int value2 = (rhs >> 10) & 3;//取出第10~11位並判斷第10~11位的值
	if (value2 == 0)
	{
		cout << "DC:未知" << ";";
	}
	else if (value2 == 1)
	{
		cout << "DC:微分修正" << ";";
	}
	else if (value2 == 2)
	{
		cout << "DC:無微分修正" << ";";
	}
	else if (value2 == 3)
	{
		cout << "DC:無效" << ";";
	}
	int value3 = (rhs & 15);//取出第0~3位並輸出其值
	cout << "PA(位置精確度):" << value3 << endl<<endl;
	return 0;
}

//計算速度精確度項(1021/095)對應的值
int VelocityAccuracy(vector<BYTE> lhs)
{
	int rhs;
	rhs = lhs[0];
	cout << "VA:" << rhs << endl<<endl;
	return 0;
}

//計算預定軌跡項(1021/110)對應的值
int TrajectoryIntent(vector<BYTE> lhs)
{

	return 0;
}


//計算位置座標(WGS-84中)項(1021/130)對應的值
int PositionWGS_84(vector<BYTE> lhs)
{
	int value1;
	value1 = ((int)lhs[0] << 24) + ((int)lhs[1] << 16) + ((int)lhs[2] << 8) + (int)lhs[3];//將容器中前4個字節合併爲一個字節,用以計算緯度。
	double temp1 = value1*(5.364418e-6);
	cout << "座標值:緯度值" << std::setiosflags(std::ios::fixed) << std::setprecision(6) << temp1 << ";";
	int value0;
	value0 = ((int)lhs[4] << 24) + ((int)lhs[5] << 16) + ((int)lhs[6] << 8) + (int)lhs[7];//將容器中後4個字節合併爲一個字節,用以計算經度。
	double temp0 = value0*(5.364418e-6);
	cout << "經度值" << std::setiosflags(std::ios::fixed) << std::setprecision(6) << temp0 << endl << endl;
	return 0;
}

//計算信號振幅項(1021/131)對應的值
int SignalAmplitude(vector<BYTE> lhs)
{
	int rhs;
	rhs = lhs[0];
	cout << "SIGNAL_AMP:" << std::dec<<rhs << endl<<endl;
	return 0;
}



//計算幾何高度項(1021/140)對應的值
int GeometricAltitude(vector<BYTE> lhs)
{
	int rhs;
	rhs = ((unsigned int)lhs[0] << 8) + (unsigned int)lhs[1];
	double value0 = rhs*6.25;
	cout << "ALTITUD:" << std::setiosflags(std::ios::fixed) << std::setprecision(2) << value0 << "FL" << endl<<endl;//以小數點後兩位的形式輸出
	return 0;
}

//計算飛行高度(1021/145)對應的值
int FlightLevel(vector<BYTE> lhs)
{
	int rhs;
	rhs = ((int)lhs[0] << 8) + (int)lhs[1];
	double value0 = rhs*0.25;
	cout << "LEVEL:" << std::setiosflags(std::ios::fixed) << std::setprecision(2) << value0 << "FL" << endl<<endl;
	return 0;
}

//計算中間態選定高度(1021/146)對應的值
int IntermediateStateSelectedAltitude(vector<BYTE> lhs)
{
	int rhs;
	rhs = ((int)lhs[0] << 8) + (int)lhs[1];//合併字節
	int value0 = rhs & 8191;//取出第0~12位
	double value01 = value0 *0.25;
	cout << "高度:" << std::setiosflags(std::ios::fixed) << std::setprecision(2) << value01 << "FL" << ";";
	int value1 = (rhs >> 15) & 1;//取出第15位
	if (value1 == 1)
	{
		cout << "SAS:提供源信息" << ";";
	}
	else
	{
		cout << "SAS:未提供源信息" << ";";
	}
	int value2 = (rhs >> 13) & 3;//取出第13~14位
	if (value2 == 0)
	{
		cout << "源:未知" << endl << endl;
	}
	else if (value2 == 1)
	{
		cout << "源:飛機高度" << endl << endl;
	}
	else if (value2 == 2)
	{
		cout << "源:FCU/MSP選定高度" << endl << endl;
	}
	else if (value2 == 3)
	{
		cout << "源:FMS選定高度" << endl << endl;
	}
	return 0;
}

//計算末態選定高度項(1021/148)對應的值
int FinalStateSelectedAltitude(vector<BYTE> lhs)
{
	int rhs;
	rhs = ((int)lhs[0] << 8) + (int)lhs[1];//合併字節
	int value0 = rhs & 8191;//取出第0~12位
	double value01 = value0 *0.25;
	cout << "高度:" << std::setiosflags(std::ios::fixed) << std::setprecision(2) << value01 << "FL" << ";";
	int value1 = (rhs >> 15) & 1;//取出第15位
	if (value1 == 1)
	{
		cout << "操縱垂直模式:起作用" << ";";
	}
	else { cout << "操縱垂直模式:不起作用" << ";"; }
	int value2 = (rhs >> 14) & 1;//取出第14位
	if (value2 == 1)
	{
		cout << "高度保持模式:起作用" << ";";
	}
	else
	{
		cout << "高度保持模式:不起作用" << ";";
	}
	int value3 = (rhs >> 13) & 1;//取出第13位
	if (value3 == 1)
	{
		cout << "近場模式:起作用" << endl<<endl;
	}
	else
	{
		cout << "近場模式:不起作用" << endl << endl;
	}
	return 0;
}



//計算幾何垂直速率項(1021/157)對應的值
int GeometricVerticalRate(vector<BYTE> lhs)
{
	int rhs;
	rhs = ((unsigned int)lhs[0]) + (unsigned int)lhs[1];
	double value0 = rhs*6.25;
	cout << "VR:" << std::setiosflags(std::ios::fixed) << std::setprecision(2) << value0 << "FT/M" << endl << endl;
	return 0;
}

//計算地向量項(1021/160)對應的值
int GroundVector(vector<BYTE> lhs)
{
	int rhs, temp;
	rhs = ((int)lhs[0] << 8) + (int)lhs[1];//將容器中前兩個字節合併爲一個字節表示,並賦給rhs。
	double value0 = rhs*0.22;
	cout << "SPD:" << std::setiosflags(std::ios::fixed) << std::setprecision(2) << value0 << "KT" << " ";
	temp = ((unsigned int)lhs[2]<< 8) + (unsigned int)lhs[3];//將容器中最後兩個字節合併爲一個字節表示,並賦給temp.
	double value1 = temp*0.0055;
	cout << "AGL:" << std::setiosflags(std::ios::fixed) << std::setprecision(2) << value1 << "DEG" << endl<<endl;
	return 0;
}

//計算目標識別項(1021/170)對應的值
int TargetIdentification(vector<BYTE> lhs)
{
	cout << "ACID:";
	long long rhs;
	rhs = ((unsigned long long)lhs[0] << 40) + ((unsigned long long)lhs[1] << 32) + ((unsigned long long)lhs[2] << 24) + ((unsigned long long)lhs[3] << 16) + ((unsigned long long)lhs[4] << 8) + (unsigned long long)lhs[5];//將6個獨立字節合併爲一個字節
	int value0 = (rhs >> 42) & 63;//取出第42~47位
	int value01 = (value0 >> 5) & 1;//取出新的二進制數的第5位,並判斷爲0還是1.
	if (value01 == 1)
	{
		char value02 = (char)value0;
		cout << value02;
	}
	else
	{
		//value0 = (value0^(1 << 6));
		value0 ^= (1 << 6);//如果第5位爲1,則將第6位取反。
		char value03 = (char)value0;
		cout << value03;
	}
	int value1 = (rhs >> 36) & 63;//取出第36~41位
	int value11 = (value1 >> 5) & 1;
	if (value11 == 1)
	{
		char value12 = (char)value1;
		cout << value12;
	}
	else
	{
		value1 ^= (1 << 6);
		char value13 = (char)value1;
		cout << value13;
	}
	int value2 = (rhs >> 30) & 63;//取出第30~35位
	int value21 = (value2 >> 5) & 1;
	if (value21 == 1)
	{
		char value22 = (char)value2;
		cout << value22;
	}
	else
	{
		value2 ^= (1 << 6);
		char value23 = (char)value2;
		cout << value23;
	}
	int value3 = (rhs >> 24) & 63;//取出第24~29位
	int value31 = (value3 >> 5) & 1;
	if (value31 == 1)
	{
		char value32 = (char)value3;
		cout << value32;
	}
	else
	{
		value3 ^= (1 << 6);
		char value33 = (char)value3;
		cout << value33;
	}
	int value4 = (rhs >> 18) & 63;//取出第18~23位
	int value41 = (value4 >> 5) & 1;
	if (value41 == 1)
	{
		char value42 = (char)value4;
		cout << value42;
	}
	else
	{
		value4 ^= (1 << 6);
		char value43 = (char)value4;
		cout << value43;
	}
	int value5 = (rhs >> 12) & 63;//取出第12~17位
	int value51 = (value5 >> 5) & 1;
	if (value51 == 1)
	{
		char value52 = (char)value5;
		cout << value52;
	}
	else
	{
		value5 ^= (1 << 6);
		char value53 = (char)value5;
		cout << value53;
	}
	int value6 = (rhs >> 6) & 63;//取出第6~11位
	int value61 = (value6 >> 5) & 1;
	if (value61 == 1)
	{
		char value62 = (char)value6;
		cout << value62;
	}
	else
	{
		value6 ^=(1 << 6);
		char value63 = (char)value6;
		cout << value63;
	}
	int value7 = rhs & 63;//取出第0~5位
	int value71 = (value7 >> 5) & 1;
	if (value71 == 1)
	{
		char value72 = (char)value7;
		cout << value72 << endl<<endl;
	}
	else
	{
		value7 ^= (1 << 6);
		char value73 = (char)value7;
		cout << value73 << endl<<endl;
	}
	return 0;
}

//計算目標狀態項(1021/200)對應值
int TargetStatus(vector<BYTE> lhs)
{
	int rhs;
	rhs = lhs[0];
	if (rhs == 0)
	{
		cout << "EMG:無緊急狀態" << endl<<endl;
	}
	else if (rhs == 1)
	{
		cout << "EMG:一般緊急狀態" << endl<<endl;
	}
	else if (rhs == 2)
	{
		cout << "EMG:醫療/救護" << endl<<endl;
	}
	else if (rhs == 3)
	{
		cout << "EMG:最低油量" << endl<<endl;
	}
	else if (rhs == 4)
	{
		cout << "EMG:無通信信號" << endl<<endl;
	}
	else if (rhs == 5)
	{
		cout << "EMG:非法干擾" << endl<<endl;
	}
	return 0;
}

//計算鏈路技術標識項(1021/210)對應的值
int LinkTechnologyIndicator(vector<BYTE> lhs)
{
	int rhs;
	rhs = lhs[0];
	int value0 = (rhs >> 4) & 1;//取出第4位(注意:字節位是從第0位開始的)
	if (value0 == 1)
	{
		cout << "DTI(交通信息座艙顯示器):飛機裝有CDTI" << ";";
	}
	else
	{
		cout << "DTI(交通信息座艙顯示器):未知" << ";";
	}
	int value1 = (rhs >> 3) & 1;//取出第3位
	if (value1 == 1)
	{
		cout << "MDS(S模式擴展型斷續振盪器):使用" << ";";
	}
	else
	{
		cout << "MDS(S模式擴展型斷續振盪器):未使用" << ";";
	}
	int value2 = (rhs >> 2) & 1;//取出第2位
	if (value2 == 1)
	{
		cout << "UAT:使用" << ";";
	}
	else
	{
		cout << "UAT:未使用" << ";";
	}
	int value3 = (rhs >> 1) & 1;//取出第1位
	if (value3 == 1)
	{
		cout << "VDL(模4):使用" << ";";
	}
	else
	{
		cout << "VDL(模4):未使用" << ";";
	}
	int value4 = rhs & 1;//取出第0位
	if (value4 == 1)
	{
		cout << "OTR(其它技術):使用" << endl<<endl;
	}
	else
	{
		cout << "OTR(其他技術):未使用" << endl<<endl;
	}
	return 0;
}




//function
//判斷下一個字節是否是符號字節
//function
bool IsMoreFspec(BYTE temp)
{
	bool ismore = false;
	BYTE tempbytes[4];
	temp <<= 7;   //
	temp >>= 7;
	tempbytes[0] = temp;
	if (0 == tempbytes[0])
	{
		ismore = false;
	}
	else
	{
		ismore = true;
	}
	return ismore;
}


//function
//解析標識符所佔字節
//function
vector<BYTE>  getFspecBytes(BYTE datas[])
{
	int count = 3;
	vector<BYTE> fspecbytes;  //定義一個空容器
	//如果下一個字節是標識符
	while (IsMoreFspec(datas[count]))
	{
		++count;
	}
	//確定標識符字節數
	vector<BYTE> lhs(count - 2);
	fspecbytes = lhs;
	for (int i = 0; i < (count - 2); ++i)
	{
		fspecbytes[i] = datas[i + 3];
	}
	return fspecbytes;
}


//function
//符合條件時,初始化對象
//function

void Datagram0(int index, DatagramUap& datagram)
{
	switch (index)
	{
	case 7:
		datagram.setDataitemname("數據源識別");//設置數據項名
		datagram.setDataitemNum("1021/010");//設置數據項參考編號
		datagram.setFrn(1);//設置字段參考編號
		datagram.setLen(2);//設置該數據段對應字節的字節數
		break;
	case 6:
		datagram.setDataitemname("目標報告描述符");
		datagram.setDataitemNum("1021/040");
		datagram.setFrn(2);
		datagram.setLen(2);
		break;
	case 5:
		datagram.setDataitemname("日時間");
		datagram.setDataitemNum("1021/030");
		datagram.setFrn(3);
		datagram.setLen(3);
		break;
	case 4:
		datagram.setDataitemname("在WGS-84座標中的位置");
		datagram.setDataitemNum("1021/130");
		datagram.setFrn(4);
		datagram.setLen(8);
		break;
	case 3:
		datagram.setDataitemname("目標地址");
		datagram.setDataitemNum("1021/080");
		datagram.setFrn(5);
		datagram.setLen(3);
		break;
	case 2:
		datagram.setDataitemname("幾何高度");
		datagram.setDataitemNum("1021/140");
		datagram.setFrn(6);
		datagram.setLen(2);
		break;
	case 1:
		datagram.setDataitemname("品質因素");
		datagram.setDataitemNum("1021/090");
		datagram.setFrn(7);
		datagram.setLen(2);
		break;
	}
}

void Datagram1(int index, DatagramUap& datagram)
{
	switch (index)
	{
	case 7:
		datagram.setDataitemname("鏈路技術");
		datagram.setDataitemNum("1021/210");
		datagram.setFrn(8);
		datagram.setLen(1);
		break;
	case 6:
		datagram.setDataitemname("側滾角");
		datagram.setDataitemNum("1021/230");
		datagram.setFrn(9);
		datagram.setLen(2);
		break;
	case 5:
		datagram.setDataitemname("大氣壓高度");
		datagram.setDataitemNum("1021/145");
		datagram.setFrn(10);
		datagram.setLen(2);
		break;
	case 4:
		datagram.setDataitemname("空速");
		datagram.setDataitemNum("1021/150");
		datagram.setFrn(11);
		datagram.setLen(2);
		break;
	case 3:
		datagram.setDataitemname("真實空速");
		datagram.setDataitemNum("1021/151");
		datagram.setFrn(12);
		datagram.setLen(2);
		break;
	case 2:
		datagram.setDataitemname("磁航項");
		datagram.setDataitemNum("1021/152");
		datagram.setFrn(13);
		datagram.setLen(2);
		break;
	case 1:
		datagram.setDataitemname("氣壓垂直速率");
		datagram.setDataitemNum("1021/155");
		datagram.setFrn(14);
		datagram.setLen(2);
		break;
	}
}

void Datagram2(int index, DatagramUap& datagram)
{
	switch (index)
	{
	case 7:
		datagram.setDataitemname("幾何垂直速率");
		datagram.setDataitemNum("1021/157");
		datagram.setFrn(15);
		datagram.setLen(2);
		break;
	case 6:
		datagram.setDataitemname("地向量");
		datagram.setDataitemNum("1021/160");
		datagram.setFrn(16);
		datagram.setLen(4);
		break;
	case 5:
		datagram.setDataitemname("轉向速率");
		datagram.setDataitemNum("1021/165");
		datagram.setFrn(17);
		datagram.setLen(1);
		break;
	case 4:
		datagram.setDataitemname("目標呼號");
		datagram.setDataitemNum("1021/170");
		datagram.setFrn(18);
		datagram.setLen(6);
		break;
	case 3:
		datagram.setDataitemname("速度精確度");
		datagram.setDataitemNum("1021/095");
		datagram.setFrn(19);
		datagram.setLen(1);
		break;
	case 2:
		datagram.setDataitemname("日時間精確度");
		datagram.setDataitemNum("1021/032");
		datagram.setFrn(20);
		datagram.setLen(1);
		break;
	case 1:
		datagram.setDataitemname("目標狀態");
		datagram.setDataitemNum("1021/200");
		datagram.setFrn(21);
		datagram.setLen(1);
		break;
	}
}

void Datagram3(int index, DatagramUap& datagram)
{
	switch (index)
	{
	case 7:
		datagram.setDataitemname("發射體類型");
		datagram.setDataitemNum("1021/020");
		datagram.setFrn(22);
		datagram.setLen(1);
		break;
	case 6:
		datagram.setDataitemname("氣象信息");
		datagram.setDataitemNum("1021/220");
		datagram.setFrn(23);
		datagram.setLen(1);
		break;
	case 5:
		datagram.setDataitemname("中間態選定高度");
		datagram.setDataitemNum("1021/146");
		datagram.setFrn(24);
		datagram.setLen(2);
		break;
	case 4:
		datagram.setDataitemname("未態選定高度");
		datagram.setDataitemNum("1021/148");
		datagram.setFrn(25);
		datagram.setLen(2);
		break;
	case 3:
		datagram.setDataitemname("目標地址");
		datagram.setDataitemNum("1021/110");
		datagram.setFrn(26);
		datagram.setLen(1);
		break;
	case 2:
		datagram.setDataitemname("八進制表示的3/A代碼");
		datagram.setDataitemNum("1021/070");
		datagram.setFrn(27);
		datagram.setLen(2);
		break;
	case 1:
		datagram.setDataitemname("信號振幅");
		datagram.setDataitemNum("1021/131");
		datagram.setFrn(28);
		datagram.setLen(1);
		break;
	}
}

void Datagram4(int index, DatagramUap& datagram)
{
	switch (index)
	{
	case 7:
		datagram.setDataitemname("數據源識別");
		datagram.setDataitemNum("1021/010");
		datagram.setFrn(1);
		datagram.setLen(2);
		break;
	case 6:
		datagram.setDataitemname("目標報告描述符");
		datagram.setDataitemNum("1021/040");
		datagram.setFrn(2);
		datagram.setLen(2);
		break;
	case 5:
		datagram.setDataitemname("日時間");
		datagram.setDataitemNum("1021/030");
		datagram.setFrn(3);
		datagram.setLen(3);
		break;
	case 4:
		datagram.setDataitemname("在WGS-84座標中的位置");
		datagram.setDataitemNum("1021/130");
		datagram.setFrn(4);
		datagram.setLen(8);
		break;
	case 3:
		datagram.setDataitemname("目標地址");
		datagram.setDataitemNum("1021/080");
		datagram.setFrn(5);
		datagram.setLen(3);
		break;
	case 2:
		datagram.setDataitemname("幾何高度");
		datagram.setDataitemNum("1021/140");
		datagram.setFrn(6);
		datagram.setLen(2);
		break;
	case 1:
		datagram.setDataitemname("品質因素");
		datagram.setDataitemNum("1021/090");
		datagram.setFrn(7);
		datagram.setLen(2);
		break;
	}
}

void Datagram5(int index, DatagramUap& datagram)
{
	switch (index)
	{
	case 7:
		datagram.setDataitemname("鏈路技術");
		datagram.setDataitemNum("1021/210");
		datagram.setFrn(8);
		datagram.setLen(1);
		break;
	case 6:
		datagram.setDataitemname("側滾角");
		datagram.setDataitemNum("1021/230");
		datagram.setFrn(9);
		datagram.setLen(2);
		break;
	case 5:
		datagram.setDataitemname("大氣壓高度");
		datagram.setDataitemNum("1021/145");
		datagram.setFrn(10);
		datagram.setLen(2);
		break;
	case 4:
		datagram.setDataitemname("空速");
		datagram.setDataitemNum("1021/150");
		datagram.setFrn(11);
		datagram.setLen(2);
		break;
	case 3:
		datagram.setDataitemname("真實空速");
		datagram.setDataitemNum("1021/151");
		datagram.setFrn(12);
		datagram.setLen(2);
		break;
	case 2:
		datagram.setDataitemname("磁航項");
		datagram.setDataitemNum("1021/152");
		datagram.setFrn(13);
		datagram.setLen(2);
		break;
	case 1:
		datagram.setDataitemname("氣壓垂直速率");
		datagram.setDataitemNum("1021/155");
		datagram.setFrn(14);
		datagram.setLen(2);
		break;
	}
}

void Datagram6(int index, DatagramUap& datagram)
{
	switch (index)
	{
	case 7:
		datagram.setDataitemname("幾何垂直速率");
		datagram.setDataitemNum("1021/157");
		datagram.setFrn(15);
		datagram.setLen(2);
		break;
	case 6:
		datagram.setDataitemname("地向量");
		datagram.setDataitemNum("1021/160");
		datagram.setFrn(16);
		datagram.setLen(4);
		break;
	case 5:
		datagram.setDataitemname("轉向速率");
		datagram.setDataitemNum("1021/165");
		datagram.setFrn(17);
		datagram.setLen(1);
		break;
	case 4:
		datagram.setDataitemname("目標呼號");
		datagram.setDataitemNum("1021/170");
		datagram.setFrn(18);
		datagram.setLen(6);
		break;
	case 3:
		datagram.setDataitemname("速度精確度");
		datagram.setDataitemNum("1021/095");
		datagram.setFrn(19);
		datagram.setLen(1);
		break;
	case 2:
		datagram.setDataitemname("日時間精確度");
		datagram.setDataitemNum("1021/032");
		datagram.setFrn(20);
		datagram.setLen(1);
		break;
	case 1:
		datagram.setDataitemname("目標狀態");
		datagram.setDataitemNum("1021/200");
		datagram.setFrn(21);
		datagram.setLen(1);
		break;
	}
}

//function
//根據位置確定數據項
//function
//參數解釋:count—符號(標識符)字節第幾個字節;index—字節第幾位
DatagramUap InitDatagram(int count, int index)
{
	DatagramUap datagram;
	switch (count)
	{
	case 0:
		Datagram0(index, datagram);
		break;
	case 1:
		Datagram1(index, datagram);
		break;
	case 2:
		Datagram2(index, datagram);
		break;
	case 3:
		Datagram3(index, datagram);
		break;
	case 4:
		Datagram4(index, datagram);
		break;
	case 5:
		Datagram5(index, datagram);
		break;
	case 6:
		Datagram6(index, datagram);
		break;
	}
	return datagram;
}



//function
//解析數據項的實體列表
//function
list<DatagramUap> DatagramParser(vector<BYTE> fspecbytes, int len, BYTE datas[])
{
	int count = 0;
	list<DatagramUap> dataitems;
	list<DatagramUap>::iterator iter;
	int rhs = fspecbytes.size();
	while (count < rhs)
	{
		int index = 7;
		while (index > 0)
		{
			vector<BYTE> tempbytes(rhs);
			for (int i = 0; i < rhs; ++i)
			{
				tempbytes[i] = fspecbytes[i];
			}
			tempbytes[count] <<= 7 - index;
			tempbytes[count] >>= 7;
			BYTE temp2[4];
			temp2[0] = tempbytes[count];
			if (temp2[0] != 0)
			{
				DatagramUap datagramuap = InitDatagram(count, index);
				dataitems.push_back(datagramuap);//依次從列尾增加元素
			}
			index--;
		}
		++count;
	}
	int currentbytenum = 0;
	vector<BYTE> databytes(len - 3 - rhs);
	for (int i = 0; i < (len - 3 - rhs); ++i)
	{
		databytes[i] = datas[i + 3 + rhs];
	}
	//DatagramUap dataitem;
	for (iter = dataitems.begin(); iter != dataitems.end(); iter++)
	{
		int temp5 = (*iter).getLen();
		vector<BYTE> bytes(temp5);
		for (int i = 0; i < temp5; ++i)
		{
			bytes[i] = databytes[i + currentbytenum];
		}
		(*iter).setDatabytes(bytes);//將每一項數據段對應字節存入容器中封裝起來
		currentbytenum += (*iter).getLen();
	}
	
	return dataitems;
}


//function
//將接收到的數據包解析
//function
DataBlock DataParser(BYTE datas[])
{
	int cat = 0;
	int len = 0;
	vector<BYTE> fspecbytes;//創建一個空的容器
	BYTE temp1[4];  //
	DataBlock datablock;  
	for (int i = 0; i < 1; ++i)
	{
		temp1[i] = datas[i];       //數組複製
	}
	cat = temp1[0];
	for (int i = 0; i < sizeof(temp1); ++i)
	{
		temp1[i] = 0;      //將數組每個元素都置爲0
	}

	for (int i = 0; i < 2; ++i)
	{
		temp1[i] = datas[i + 1];
	}
	//
	BYTE c;
	c = temp1[0];
	temp1[0] = temp1[1];
	temp1[1] = c;
	len = temp1[0];
	for (int i = 0; i < sizeof(temp1); ++i)
	{
		temp1[i] = 0;   //將數組每個元素置爲0
	}
	fspecbytes = getFspecBytes(datas);//獲取標識符所佔字節
	list<DatagramUap> dataitems = DatagramParser(fspecbytes, len, datas);//解析出數據項的實體列表
	
	datablock.setCat(cat);
	datablock.setLen(len);
	datablock.setDataitem(dataitems);

	return datablock;

}


int main()
{
    
    BYTE temp[] = {
        0x15,0x00,0x2b,0xff,0x95,0x91,0x80,0x00,0x10,0x01,0x21,0x00,0x00,0x93,0x00,0x79,0xdb,0x57,0x00,0xea,0xce,0x41,0x78,0x04,0x8b,0x0d,0x30,0x00,0x09,0x10,0x07,0xf1,0x3a,0xe7,0x04,0x40,0x0c,0x54,0xf5,0xd3,0x1c,0xa0,0x00
    };

	DataBlock datalock = DataParser(temp);
	list<DatagramUap>::iterator iter0;
	list<DatagramUap> temp0;
	
	temp0=datalock.getDataitem();
	int i = 1;
	for (iter0 = temp0.begin(); iter0 != temp0.end(); iter0++)
	{
		//int i = 1;
		cout << "第" << std::dec<<i << "個數據。" << endl;
		cout << "數據條款名:"<< (*iter0).getDataitemname().c_str() << endl;
		cout << "數據編號:" << (*iter0).getDataitemNum().c_str() << endl;
		string num = (*iter0).getDataitemNum();
		vector<BYTE> temp10 = (*iter0).getDatabytes();

		//加入條件判斷,符合則輸出數據項對應的值
		if (num =="1021/010")//注意相等的表示
		{
			DataSourceIdentifiction(temp10);
		}
		else if (num == "1021/020")
		{
			EmitterCategory(temp10);
		}
		else if (num == "1021/030")
		{
			TimeOfDay(temp10);
		}
		else if (num == "1021/032")
		{
			TimeofDayAccuracy(temp10);
		}
		else if (num == "1021/040")
		{
			Target(temp10);
		}
		else if (num == "1021/070")
		{
			Mode3_ACodeinOctalRepresentation(temp10);
		}
		else if (num == "1021/080")
		{
			TargetAddress(temp10);
		}
		else if (num == "1021/090")
		{
			FigureOfMerit(temp10);
		}
		else if (num == "1021/095")
		{
			VelocityAccuracy(temp10);
		}
		else if (num == "1021/110")
		{

		}
		else if (num == "1021/130")
		{
			PositionWGS_84(temp10);
		}
		else if (num == "1021/131")
		{
			SignalAmplitude(temp10);
		}
		else if (num == "1021/140")
		{
			GeometricAltitude(temp10);
		}
		else if (num == "1021/145")
		{
			FlightLevel(temp10);
		}
		else if (num == "1021/146")
		{
			IntermediateStateSelectedAltitude(temp10);
		}
		else if (num == "1021/148")
		{
			FinalStateSelectedAltitude(temp10);
		}
		else if (num == "1021/157")
		{
			GeometricVerticalRate(temp10);
		}
		else if (num == "1021/160")
		{
			GroundVector(temp10);
		}
		else if (num == "1021/170")
		{
			TargetIdentification(temp10);
		}
		else if (num == "1021/200")
		{
			TargetStatus(temp10);
		}
		else if (num == "1021/210")
		{
			LinkTechnologyIndicator(temp10);
		}
		++i;

	}
	return 0;
}




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