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 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 parse_optionData(self, stream: BitStreamReader): # pylint: disable=invalid-name """Parse attribute optionData""" clsType = ZIPPacketOptionData length = stream.byte() data = stream.value(length) if self.optionType == ZIPPacketOptionType.MAINTENANCE_REPORT: clsType = ZIPPacketOptionMaintenanceReport elif self.optionType == ZIPPacketOptionType.ENCAPSULATION_FORMAT_INFORMATION: clsType = ZIPPacketOptionEncapsulationFormatInfo elif self.optionType == ZIPPacketOptionType.EXPECTED_DELAY: clsType = ZIPPacketOptionExpectedDelay cls = clsType() if hasattr(cls, "parseAttributes"): cls.parseAttributes(BitStreamReader(data)) elif hasattr(cls, "__setstate__"): data = clsType.deserialize(BitStreamReader(data)) cls.__setstate__(data) else: value = clsType.deserialize(BitStreamReader(data)) return clsType(value) return cls
def test_BitStreamReader_remaining(streamReader: BitStreamReader): assert streamReader.remaining(advance=False) == b"\x02\x01\xcb@" assert streamReader.value(1) == b"\x02" assert streamReader.remaining() == b"\x01\xcb@"
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))
def parse_command(stream: BitStreamReader): # pylint: disable=invalid-name """Parse the length prefixed command""" length = stream.byte() return Message.decode(stream.value(length))
def parse_value(self, stream: BitStreamReader): # pylint: disable=invalid-name """Decode the value from the report""" return int.from_bytes(stream.value(self.size), "big", signed=False)