def deserialize(cls, stream: BitStreamReader): """Deserialize metadata extension""" retval = {} while stream.bytesLeft(): metadataType = stream.bits(7) _critical = stream.bit() length = stream.byte() retval[metadataType] = stream.value(length) return retval
def parse_queueHandle(stream: BitStreamReader): # pylint: disable=invalid-name """Parse queueHandle from raw bitstream""" # According to the docs queueHandle should be an uint8_t value # just like the other similar messages. But for unknown reason zipgateway # sends this like an ipv6 address (at least version 7.11.01) print("Node failing", stream.remaining(advance=False)) if stream.bytesLeft() == 16: stream.advance(8 * 15) return stream.byte()
def deserialize(cls, stream: BitStreamReader): """Deserialize header extension from stream""" retval = {} extLength = stream.byte() - 1 reader = BitStreamReader(stream.value(extLength)) while reader.bytesLeft() > 0: option = ZIPPacketOption() option.parseAttributes(reader) retval[option.optionType] = option.optionData return retval
def deserialize(cls, stream: BitStreamReader): """Deserialize ZIP Maintenance Report""" retval = {} while stream.bytesLeft(): imeType = IMEType(stream.byte()) length = stream.byte() imeVal = stream.value(length) typeCls = IME_MAPPING.get(imeType, IMEUnknownValue) retval[imeType] = typeCls.load(BitStreamReader(imeVal)) return retval
def deserialize(stream: BitStreamReader): """Deserialize a bitstream into a Message object""" if stream.bytesLeft() < 2: return UnknownMessage(0x0000) cmdClass = stream.byte() cmd = stream.byte() hid = cmdClass << 8 | (cmd & 0xFF) MsgCls = ZWaveMessage.get(hid, None) # pylint: disable=invalid-name if MsgCls: msg = MsgCls() msg.parseAttributes(stream) else: msg = UnknownMessage(hid) return msg
def parseAttributes(self, stream: BitStreamReader): """Populate the attributes from a raw bitstream.""" for attr in self.attributes: if stream.bytesLeft() == 0: # No more data, cannot decode rest of the attributes break attrName, attrType = attr[0], attr[1] deserializer = getattr(self, "parse_{}".format(attrName), None) if deserializer: value = deserializer(stream) else: value = attrType.deserialize(stream) # This can be optimized to reduce the second loop in __setattr__ setattr(self, attrName, value)
def test_BitStreamReader_eof(streamReader: BitStreamReader): streamReader.remaining() assert streamReader.bytesLeft() == 0 with pytest.raises(EOFError): streamReader.byte()
def parse_commandClass(self, stream: BitStreamReader): # pylint: disable=invalid-name """Parse the length prefixed command""" length = self.nodeInfoLength - 7 if length > stream.bytesLeft(): return list(stream.remaining()) return list(stream.value(length))