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