def decode(self, input_file): # Encode aivdm data back into binary fragments = [] payload = self._aivdm[1][0] data = Data(input_file) while data: try: calculated_crc = self._get_crc(data) packet = decode(self._aivdm[0], data) if packet.checksum != calculated_crc: sys.stderr.write('Crc mismatch; expected %02X, but ' 'calculated %02X. Skipping packet.\n' % (packet.checksum, calculated_crc)) continue bits = encode(payload, list(ord(c.character) for c in packet.payload)) bits = bits.pop(len(bits) - packet.num_fill_bits) if len(fragments) == packet.fragment_number - 1: fragments.append(bits) if len(fragments) == packet.fragment_count: self._decode_ais(reduce(operator.add, fragments)) fragments = [] else: sys.stderr.write('Expected fragment number %i, got %i (of %i)\n' % ( len(fragments) + 1, packet.fragment_number, packet.fragment_count)) fragments = [] except DecodeError, ex: filename, line_number, column_number = self._aivdm[2][ex.entry] sys.stderr.write('%s[%i] - %s\n' % (filename, line_number, ex)) fragments = [] # Read to the next newline while data and data.pop(8).text('ascii') != '\n': pass