def parse_data(self): rtnval = None buf = ''.join([self.buf[x] for x in range(0, self.header.length)]) crcval = calcCrc32(buf[: -4]) rst = struct.unpack('<I', bytearray(buf[-4:])) if (crcval != rst[0]): self.parserlogger.warning('Data field CRC32 failed. header={}'.format(self.header)) rtnval = (False, HEADER_LEN) else: # print 'CRC32[{}] {}'.format(base64.b16encode(buf[-4:]), # str(self.crc32.crcValue == rst[0])) raw_buf = buf[HEADER_LEN: self.header.length - 4] if self.header.enc: raw_buf = decodeAES(raw_buf)[: -self.header.pad] #### TODO debug #### if self.header.ack: self.parserlogger.debug(self.header) #################### self.output_msg_queue.put((self.header, raw_buf), timeout=10.0) rtnval = (True, self.header.length) return rtnval
def pack(self): header = ProtocolHeader() self.head_buf = header.render( data_length=len(self.data_buf), session=self.session_id, ack=0, pad=self.pad, enc=self.enc, seq=self.seq, ) self.header = header raw_buf = ''.join([self.head_buf, self.data_buf]) crcval = calcCrc32(raw_buf) crc_buf = struct.pack('<I', crcval) return raw_buf + crc_buf