def parse(self): print(" Parsing xRIT headers...") primaryHeader = self.data[:16] # Header fields self.HEADER_TYPE = get_bits_int(primaryHeader, 0, 8, 128) # File Counter (always 0x00) self.HEADER_LEN = get_bits_int(primaryHeader, 8, 16, 128) # Header Length (always 0x10) self.FILE_TYPE = get_bits_int(primaryHeader, 24, 8, 128) # File Type self.TOTAL_HEADER_LEN = get_bits_int(primaryHeader, 32, 32, 128) # Total xRIT Header Length self.DATA_LEN = get_bits_int(primaryHeader, 64, 64, 128) # Data Field Length if self.FILE_TYPE == 0: self.FILE_TYPE = "Image Data" elif self.FILE_TYPE == 1: self.FILE_TYPE = "GTS Message" elif self.FILE_TYPE == 2: self.FILE_TYPE = "Alphanumeric Text" elif self.FILE_TYPE == 3: self.FILE_TYPE = "Encryption Key Message" elif self.FILE_TYPE == 128: self.FILE_TYPE = "CMDPS Analysis Data" elif self.FILE_TYPE == 129: self.FILE_TYPE = "NWP Data" elif self.FILE_TYPE == 130: self.FILE_TYPE = "GOCI Data" elif self.FILE_TYPE == 131: self.FILE_TYPE = "Typhoon Info" print(" TYPE: {}".format(self.FILE_TYPE)) #print(" HEADER LENGTH: {} bits".format(self.TOTAL_HEADER_LEN)) #print(" DATA LENGTH: {} bits".format(self.DATA_LEN)) # Loop through headers until Annotation Text header (type 4) offset = self.HEADER_LEN nextHeader = self.get_next_header(offset) while nextHeader != 4: offset += self.get_header_len(offset) nextHeader = self.get_next_header(offset) # Parse Annotation Text header (type 4) athLen = self.get_header_len(offset) self.OUTPUT_FILE_NAME = self.data[offset + 3:offset + athLen].decode('utf-8') print(" FILE NAME: {}".format(self.OUTPUT_FILE_NAME)) return
def parse(self): """ Parse TP_File header fields """ header = self.data[:10] # Header fields self.COUNTER = get_bits_int(header, 0, 16, 80) # File Counter self.LENGTH = int(get_bits_int(header, 16, 64, 80)/8) # File Length # Add post-header data to payload self.PAYLOAD = self.data[10:]
def parse(self): """ Parses xRIT primary and key headers """ primaryHeader = self.data[:16] # Header fields HEADER_TYPE = get_bits_int(primaryHeader, 0, 8, 128) # File Counter (always 0x00) HEADER_LEN = get_bits_int(primaryHeader, 8, 16, 128) # Header Length (always 0x10) FILE_TYPE = get_bits_int(primaryHeader, 24, 8, 128) # File Type TOTAL_HEADER_LEN = get_bits_int(primaryHeader, 32, 32, 128) # Total xRIT Header Length DATA_LEN = get_bits_int(primaryHeader, 64, 64, 128) # Data Field Length #print(" Header Length: {} bits ({} bytes)".format(TOTAL_HEADER_LEN, TOTAL_HEADER_LEN/8)) #print(" Data Length: {} bits ({} bytes)".format(DATA_LEN, DATA_LEN/8)) self.headerField = self.data[:TOTAL_HEADER_LEN] self.dataField = self.data[TOTAL_HEADER_LEN: TOTAL_HEADER_LEN + DATA_LEN] # Loop through headers until Key header (type 7) offset = 0 nextHeader = int.from_bytes(self.headerField[offset : offset + 1], byteorder='big') while nextHeader != 7: offset += int.from_bytes(self.headerField[offset + 1 : offset + 3], byteorder='big') nextHeader = int.from_bytes(self.headerField[offset : offset + 1], byteorder='big') # Parse Key header (type 7) keyHLen = int.from_bytes(self.headerField[offset + 1 : offset + 3], byteorder='big') index = self.headerField[offset + 5 : offset + keyHLen] # Catch wrong key index try: self.key = self.keys[index] except KeyError: if index != b'\x00\x00': print(" UNKNOWN ENCRYPTION KEY INDEX") self.key = 0 # Check block length if encryption is applied if self.key != 0: # Append null bytes to data field to fill last 8 byte DES block dFMod8 = len(self.dataField) % 8 if dFMod8 != 0: for i in range(dFMod8): self.dataField += b'x00'
def parse(self): """ Parse CP_PDU header fields """ header = self.data[:6] # Header fields self.VER = get_bits(header, 0, 3, 48) # Version (always b000) self.TYPE = get_bits(header, 3, 1, 48) # Type (always b0) self.SHF = get_bits(header, 4, 1, 48) # Secondary Header Flag self.APID = get_bits_int(header, 5, 11, 48) # Application Process ID self.SEQ = get_bits_int(header, 16, 2, 48) # Sequence Flag self.COUNTER = get_bits_int(header, 18, 14, 48) # Packet Sequence Counter self.LENGTH = get_bits_int(header, 32, 16, 48) + 1 # Packet Length # Parse sequence flag seqn = ["CONTINUE", "FIRST", "LAST", "SINGLE"] self.SEQ = seqn[self.SEQ] # Add post-header data to payload self.PAYLOAD = self.data[6:]
def parse(self): header = self.data[:2] # Header fields self.SPARE = get_bits(header, 0, 5, 16) # Spare Field (always b00000) self.POINTER = get_bits_int(header, 5, 11, 16) # First Pointer Header # Detect if M_PDU contains CP_PDU header if self.POINTER != 2047: # 0x07FF self.HEADER = True else: self.HEADER = False self.FRAME = self.data[2:]
def parse(self): header = self.data[self.offset:self.offset + 6] # Header fields self.VER = get_bits(header, 0, 3, 48) # Version (always b000) self.TYPE = get_bits(header, 3, 1, 48) # Type (always b0) self.SHF = get_bits(header, 4, 1, 48) # Secondary Header Flag self.APID = get_bits_int(header, 5, 11, 48) # Application Process ID self.SEQ = get_bits_int(header, 16, 2, 48) # Sequence Flag self.COUNTER = get_bits_int(header, 18, 14, 48) # Packet Sequence Counter self.LENGTH = get_bits_int(header, 32, 16, 48) + 1 # Packet Length if self.SEQ == 0: self.SEQ = "CONTINUE" elif self.SEQ == 1: self.SEQ = "FIRST" elif self.SEQ == 2: self.SEQ = "LAST" elif self.SEQ == 3: self.SEQ = "SINGLE" self.PRE_HEADER_DATA = self.data[0:self.offset] self.POST_HEADER_DATA = self.data[self.offset + 6:]
def parse(self): header = self.data[:6] # Header fields self.VER = get_bits_int(header, 0, 2, 48) # Virtual Channel Version self.SCID = get_bits_int(header, 2, 8, 48) # Spacecraft ID self.VCID = get_bits_int(header, 10, 6, 48) # Virtual Channel ID self.COUNT = get_bits_int(header, 16, 24, 48) # VCDU Counter self.REPLAY = get_bits_int(header, 40, 1, 48) # Replay Flag self.SPARE = get_bits_int(header, 41, 7, 48) # Spare (always b0000000) self.get_SC_name() self.get_VC_name() self.MPDU = self.data[6:]
def parse(self): """ Parse VCDU header fields """ header = self.data[:6] # Header fields self.VER = get_bits_int(header, 0, 2, 48) # Virtual Channel Version self.SCID = get_bits_int(header, 2, 8, 48) # Spacecraft ID self.VCID = get_bits_int(header, 10, 6, 48) # Virtual Channel ID self.COUNT = get_bits_int(header, 16, 24, 48) # VCDU Counter self.REPLAY = get_bits_int(header, 40, 1, 48) # Replay Flag self.SPARE = get_bits_int(header, 41, 7, 48) # Spare (always b0000000) # Spacecraft and virtual channel names self.SC = self.get_SC(self.SCID) self.VC = self.get_VC(self.VCID) # M_PDU contained in VCDU self.MPDU = self.data[6:]
def parse(self): header = self.data[:10] # Header fields self.COUNTER = get_bits_int(header, 0, 16, 80) # File Counter self.LENGTH = get_bits_int(header, 16, 64, 80) # File Length