def UnpackFromBytes(self, bytes): if len(bytes) < 16: raise ValueError, "Not enough bytes" header = bytes[:12] payload = bytes[12:-4] trailer = bytes[-4:] crcd_bytes = bytes[:-2] prefix, message_id, message_len = struct.unpack('<8sHH', header) if len(payload) != message_len: raise ValueError, "Payload size does not match tag" # TODO(mikey): assert checked_crc == 0 checked_crc = crc16.crc16_ccitt(crcd_bytes) self.UnpackFromPayload(payload)
def ToBytes(self): payload = cStringIO.StringIO() for field_name, field in self._fields.iteritems(): field_bytes = field.ToBytes(self._values[field_name]) payload.write(struct.pack('<BB', field.tagnum, len(field_bytes))) payload.write(field_bytes) payload_str = payload.getvalue() payload.close() out = cStringIO.StringIO() out.write(KBSP_PREFIX) out.write(struct.pack('<HH', self.MESSAGE_ID, len(payload_str))) out.write(payload_str) crc = crc16.crc16_ccitt(out.getvalue()) out.write(struct.pack('<H', crc)) out.write('\r\n') return out.getvalue()
def testCrc(self): data = '\x01\x02\x03\x04' crc = crc16.crc16_ccitt(data) data += struct.pack('<H', crc) self.assertEqual(crc16.crc16_ccitt(data), 0)