public string Decode(byte[] Data, string Time) { // Define output data buffer string DataOut; // Determine Length of FSPEC fields in bytes int FSPEC_Length = ASTERIX.DetermineLenghtOfFSPEC(Data); // Determine SIC/SAC Index int SIC_Index = 2 + FSPEC_Length; int SAC_Index = SIC_Index + 1; // Extract SIC/SAC Indexes. DataOut = Data[SIC_Index].ToString() + '/' + Data[SAC_Index].ToString(); // Creates and initializes a BitVector32 with all bit flags set to FALSE. BitVector32 FourFSPECOctets = ASTERIX.GetFourFSPECOctets(Data); // Loop for each FSPEC and determine what data item is present for (int FSPEC_Index = 1; FSPEC_Index <= FSPEC_Length; FSPEC_Index++) { switch (FSPEC_Index) { case 1: // 010 Data Source Identifier if (FourFSPECOctets[Bit_Ops.Bit7] == true) { DataOut = DataOut + " 010:T"; I063DataItems[ItemIDToIndex("010")].IsPresent = true; } else { DataOut = DataOut + " 010:F"; } // 015, Service Identification if (FourFSPECOctets[Bit_Ops.Bit6] == true) { DataOut = DataOut + " 015:T"; I063DataItems[ItemIDToIndex("015")].IsPresent = true; } else { DataOut = DataOut + " 015:F"; } // 030, Time of Message if (FourFSPECOctets[Bit_Ops.Bit5] == true) { DataOut = DataOut + " 030:T"; I063DataItems[ItemIDToIndex("030")].IsPresent = true; } else { DataOut = DataOut + " 030:F"; } // 050, Sensor Identifier if (FourFSPECOctets[Bit_Ops.Bit4] == true) { DataOut = DataOut + " 050:T"; I063DataItems[ItemIDToIndex("050")].IsPresent = true; } else { DataOut = DataOut + " 050:F"; } // 060, Sensor Configuration and Status if (FourFSPECOctets[Bit_Ops.Bit3] == true) { DataOut = DataOut + " 060:T"; I063DataItems[ItemIDToIndex("060")].IsPresent = true; } else { DataOut = DataOut + " 060:F"; } // 070, Time Stamping Bias if (FourFSPECOctets[Bit_Ops.Bit2] == true) { DataOut = DataOut + " 070:T"; I063DataItems[ItemIDToIndex("070")].IsPresent = true; } else { DataOut = DataOut + " 070:F"; } // 080, SSR / Mode S Range Gain and Bias if (FourFSPECOctets[Bit_Ops.Bit1] == true) { DataOut = DataOut + " 080:T"; I063DataItems[ItemIDToIndex("080")].IsPresent = true; } else { DataOut = DataOut + " 080:F"; } break; case 2: // 081, SSR / Mode S Azimuth Bias if (FourFSPECOctets[Bit_Ops.Bit15] == true) { DataOut = DataOut + " 081:T"; I063DataItems[ItemIDToIndex("081")].IsPresent = true; } else { DataOut = DataOut + " 081:F"; } // 090, PSR Range Gain and Bias if (FourFSPECOctets[Bit_Ops.Bit14] == true) { DataOut = DataOut + " 090:T"; I063DataItems[ItemIDToIndex("090")].IsPresent = true; } else { DataOut = DataOut + " 090:F"; } // 091, PSR Azimuth Bias if (FourFSPECOctets[Bit_Ops.Bit13] == true) { DataOut = DataOut + " 091:T"; I063DataItems[ItemIDToIndex("091")].IsPresent = true; } else { DataOut = DataOut + " 091:F"; } // 092, PSR Elevation Bias if (FourFSPECOctets[Bit_Ops.Bit12] == true) { DataOut = DataOut + " 092:T"; I063DataItems[ItemIDToIndex("092")].IsPresent = true; } else { DataOut = DataOut + " 092:F"; } // Spare if (FourFSPECOctets[Bit_Ops.Bit11] == true) { DataOut = DataOut + " SPR:T"; } else { DataOut = DataOut + " SPR:F"; } // RE Reserved Expansion Field if (FourFSPECOctets[Bit_Ops.Bit10] == true) { DataOut = DataOut + " RES:T"; } else { DataOut = DataOut + " RES:F"; } // SP Special Purpose Field if (FourFSPECOctets[Bit_Ops.Bit9] == true) { DataOut = DataOut + " SPF:T"; } else { DataOut = DataOut + " SPF:F"; } break; // Handle errors default: DataOut = DataOut + " UKN:T"; break; } CAT63DecodeAndStore.Do(Data); } // Return decoded data return(DataOut); }