def _build(self, obj, stream, context, path): if not isinstance(obj, integertypes): raise IntegerError("value is not an integer", path=path) if obj < 0: raise IntegerError("cannot build from negative number: %r" % (obj, ), path=path) if obj > 0xFFFF: raise IntegerError( "cannot build from number above short range: %r" % (obj, ), path=path) x = obj if (x > 0x3FFF): x |= 0xFF0000 nbytes = 3 elif (x > 0x7F): x |= 0x8000 nbytes = 2 else: nbytes = 1 for i in range(nbytes, 0, -1): stream_write(stream, int2byte((x >> (8 * (i - 1))) & 0xFF), 1, path) return obj
def _build(self, obj, stream, context, path): try: data = self.packer.pack(obj) except Exception: raise FormatFieldError( "struct %r error during building, given value %r" % (self.fmtstr, obj)) data = swapbitsinbytes(data) stream_write(stream, data, self.length) return obj
def _build(self, obj, stream, context, path): opcode = obj["opcode"] try: message = self._opcodes[opcode] except KeyError: Opcode()._build(opcode, stream, context, path) stream_write(stream, obj["params"]) return obj return message._build(obj, stream, context, path)
def _build_sensor_setting(self, obj, stream, context, path, sensor_setting_property_id): try: sensor_setting_property_id = PropertyID(sensor_setting_property_id) sensor_setting_name = sensor_setting_property_id.name.lower() except ValueError: sensor_setting_name = "sensor_setting_raw" sensor_setting_raw = obj.get(sensor_setting_name, obj.get("sensor_setting_raw")) try: PropertyDict[sensor_setting_property_id]._build(sensor_setting_raw, stream, context, path) except KeyError: stream_write(stream, bytes(sensor_setting_raw)) return obj
def _build(self, obj, stream, context, path): format = obj["format"] length = obj["length"] sensor_setting_property_id = obj["sensor_setting_property_id"] sensor_setting_raw = obj["sensor_setting_raw"] if format: stream_write(stream, bytes([(length - 1) << 1 | 0x01])) stream_write(stream, sensor_setting_property_id.to_bytes(2, byteorder='little')) stream_write(stream, bytes(sensor_setting_raw)) else: stream_write(stream, bytes([(length - 1) << 1 | (sensor_setting_property_id & 0b111) << 5])) stream_write(stream, bytes([sensor_setting_property_id >> 3])) PropertyDict[sensor_setting_property_id]._build(sensor_setting_raw, stream, context, path) return obj
def _build(self, obj, stream, context, path): # expect `None`, we're building a placeholder instead of a real value if obj is not None: raise DeferredError(f'building expected `None`, but got {obj}', path=path) # calculate current offset in outermost stream target_offset = get_offset_in_outer_stream(stream, context, path) # build placeholder value in place of real value placeholder_data = os.urandom(self.placeholder_size) stream_write(stream, placeholder_data, len(placeholder_data), path) # create and return meta object, which can later be used by `WriteDeferredValue` return self._create_global_meta(context, path, self.subcon, target_offset, placeholder_data)
def _build(self, obj, stream, context, path): opcode = obj["opcode"] try: if isinstance(opcode, str): opcode, message = next(v for k, v in self._opcodes.items() if v[0].name == opcode) obj["opcode"] = opcode else: opcode, message = self._opcodes[opcode] except KeyError: Opcode()._build(opcode, stream, context, path) stream_write(stream, obj["params"]) return obj return message._build(obj, stream, context, path)
def _build(self, obj, stream, context, path): if not isinstance(obj, integertypes): raise IntegerError("value %r is not an integer" % (obj,)) if obj < 0 and not self.signed: raise IntegerError("value %r is negative, but field is not signed" % (obj,)) length = self.length if callable(length): length = length(context) if length < 0: raise IntegerError("length must be non-negative") data = integer2bits(obj, length) if self.swapped: if length & 7: raise IntegerError( "little-endianness is only defined for multiples of 8 bits" ) data = swapbytes(data) data = data[::-1] stream_write(stream, data, length, path) return obj
def _build(self, obj, stream, context, path): if not isinstance(obj, integertypes): raise IntegerError("Value is not an integer") to_write = obj for i in range(5): byte = 0 length = self.lengths[i] if i == 0: negative = obj < 0 byte |= self.negative_bit * negative if negative: to_write *= -1 mask = self._get_data_mask(length) byte |= to_write & mask to_write >>= length more_bit = (to_write > 0) and self._get_more_bit(length) byte |= more_bit byte &= 0xFF stream_write(stream, int2byte(byte), 1, path) if not more_bit: break return obj
def _build(self, obj, stream, context, path): if obj < 0xff: stream_write(stream, bytes([obj]), 1, path) else: stream_write(stream, bytes([0xff]), 1, path) stream_write(stream, struct.pack('<l', obj), 4, path) return obj
def _build(self, obj, stream, context, path): if obj > 0xFFFF: stream_write(stream, obj.to_bytes(3, byteorder="big")) elif obj > 0xFF: stream_write(stream, obj.to_bytes(2, byteorder="big")) else: stream_write(stream, obj.to_bytes(1, byteorder="big")) return self.type(obj)
def _build(self, obj, stream, context, path): buildret = self.subcon._build(obj, stream, context, path) pad = self._pad(stream, path) stream_write(stream, self.pattern * pad, pad, path) return buildret