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进制输出rhsreturn 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
//符合条件时,初始化对象
//functionvoid 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;
}

cat 021 解析相关推荐

  1. 为什么要用CAT工具辅助翻译?为什么要用翻译管理系统?以memoQ为例

    文章节选改编自大辞科技官网文章<为什么要使用CAT进行翻译?以memoQ为例> 1. 为什么要用计算机辅助翻译工具(Computer Aided Translation,CAT工具) 1. ...

  2. Vue_VueResource

    Vue可以构建一个完全不依赖后端服务的应用,同时也可以与服务端进行数据交互来同步界面的动态更新. Vue通过插件的形式实现了基于AJAX,JSPNP等技术的服务端通信. vue-resource是一个 ...

  3. Hadoop 集群的三种方式

    1,Local(Standalone) Mode 单机模式 $ mkdir input$ cp etc/hadoop/*.xml input$ bin/hadoop jar share/hadoop/ ...

  4. CS231n Convolutional Neural Networks for Visual Recognition------Python Tutorial

    源链接为:http://cs231n.github.io/python-numpy-tutorial/. 这篇指导书是由Justin Johnson编写的. 在这门课程中我们将使用Python语言完成 ...

  5. 阿里巴巴最新开源项目 - [HandyJSON] 在Swift中优雅地处理JSON

    项目名称:HandyJSON 项目地址:https://github.com/alibaba/handyjson 背景 JSON是移动端开发常用的应用层数据交换协议.最常见的场景便是,客户端向服务端发 ...

  6. HandyJSON:Swift语言JSON转Model工具库

    背景 JSON是移动端开发常用的应用层数据交换协议.最常见的场景便是,客户端向服务端发起网络请求,服务端返回JSON文本,然后客户端解析这个JSON文本,再把对应数据展现到页面上. 但在编程的时候,处 ...

  7. vue-resource中文文档

    Vue可以构建一个完全不依赖后端服务的应用,同时也可以与服务端进行数据交互来同步界面的动态更新. Vue通过插件的形式实现了基于AJAX,JSPNP等技术的服务端通信. vue-resource是一个 ...

  8. minishell的实现

    直接上各个模块的代码,注释都在文档代码中,非常详细,加上最后的Makefile文件完全可以自行运行看懂: main函数一个文件main.c 1 /* 2 minishell实现的功能:简单命令解析.管 ...

  9. 李沐动手学深度学习v2-目标检测中的锚框和代码实现

    一.目标检测中的锚框 前提: 本节锚框代码实现,使用了很多Pytorch内置函数,如果有对应函数看不懂的地方,可以查看前面博客对相应函数的具体解释,如下链接所示: Pytorch中torch.mesh ...

最新文章

  1. 原型模式Prototype,constructor,__proto__详解
  2. Clover 驱动文件夹_四叶草Clover文件夹结构功能+快捷键——墨涩网
  3. SSL 2311-车厢调度[栈]
  4. 通知:前blog文章全丢了..
  5. [免费网络研讨会] Java 11的第一印象
  6. .NETFramework-Web.Mvc:ViewResult
  7. Coursera自动驾驶课程第3讲:Self-Driving Hardware and Software Architectures
  8. 论文浅尝 - CIKM2021 | DT-GCN: 一种双曲空间中的数据类型感知的知识图谱表示学习模型...
  9. python mssql session_python的web框架webpy【session amp; cookie】五 - 莫激动 - ITeye博客
  10. 编写一个程序,要求输入一个ASCII码值(如66),然后输入相应的字符`
  11. Vue路由设置嵌套(一级二级三级展示并且显示定向选中)
  12. 动态模型之增压暂停【FunTester测试框架】
  13. 危险的SharedPreference操作
  14. 决策树(十)--GBDT及OpenCV源码分析
  15. (1)Matplotlib_xticks, yticks
  16. 笨方法学python3 epub_Python3.5从零开始学[azw3+epub+mobi][77.37MB]
  17. Java 汉字转拼音(完美支持解决多音字)
  18. 最大销售额——01背包问题
  19. 微信小程序实现旋转动画效果
  20. JS: break 终止循环 continue跳过循环体中不想执行的语句

热门文章

  1. 两种方法 Find inorder succ of BST
  2. Python实现12306自动抢票小程序
  3. ETCP集团董事长谭龙:智慧停车不只是工具,更是社会公器
  4. tensorflow/stream_executor/cuda/cuda_dnn.cc:378] Loaded runtime CuDNN library: 7301--2019.5.12
  5. 一站式登录授权系统(单点登录+授权管理)
  6. ASP.NET 入门
  7. Vector的sort的使用
  8. 用Python来进行词频统计
  9. 集成显卡 独立显卡 带 双显示器
  10. tracert 实作