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;
}




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