def __init__(self, number_bits, field=None, **kwargs): BaseField.__init__(self, **kwargs) self._ordered_bitfields = [] self._bitfield_map = {} if number_bits % 8 != 0: raise SuitcaseProgrammingError( "Number of bits must be a factor of " "8, was %d" % number_bits) self.number_bits = number_bits self.number_bytes = number_bits // 8 self.bytes_required = self.number_bytes if field is None: field = { 1: UBInt8, 2: UBInt16, 3: UBInt24, 4: UBInt32, 8: UBInt64, }[self.number_bytes]() self._field = field.create_instance(self._parent) placeholders = [] for key, value in six.iteritems(kwargs): if isinstance(value, _BitFieldFieldPlaceholder): placeholders.append((key, value)) for key, placeholder in sorted(placeholders, key=lambda kv: kv[1].sequence_number): value = placeholder.create_instance() self._bitfield_map[key] = value self._ordered_bitfields.append((key, value))
def _length_value_provider(): sio = BytesIO() target_field.pack(sio) target_field_length = len(sio.getvalue()) if not target_field_length % self.multiplier == 0: raise SuitcaseProgrammingError("Payload length not divisible " "by %s" % self.multiplier) return (target_field_length // self.multiplier)
def _length_value_provider(): sio = BytesIO() target_field.pack(sio) target_field_length = len(sio.getvalue()) if target_field_length != self.get_adjusted_length(): raise SuitcaseProgrammingError( "Payload length %i does not" " match length %i specified by type" % (target_field_length, self.get_adjusted_length())) return target_field_length
def setval(self, value): try: vtype = type(value) key = self.inverse_dispatch_mapping[vtype] except KeyError: raise SuitcaseProgrammingError("The type specified is not in the " "dispatch table") # OK, things check out. Set both the value here and the # type byte value self._value = value value._parent = self._parent self.dispatch_field.setval(key)
def setval(self, value): raise SuitcaseProgrammingError("Setting the value of a bitfield " "directly is prohibited")
def setval(self, value): raise SuitcaseProgrammingError("Cannot set the value of a LengthField")
def setval(self, *args): raise SuitcaseProgrammingError("One does not simply modify Magic")
def setval(self, *args): raise SuitcaseProgrammingError("CRC will be set automatically")