예제 #1
0
    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))
예제 #2
0
 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)
예제 #3
0
 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
예제 #4
0
    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)
예제 #5
0
 def setval(self, value):
     raise SuitcaseProgrammingError("Setting the value of a bitfield "
                                    "directly is prohibited")
예제 #6
0
 def setval(self, value):
     raise SuitcaseProgrammingError("Cannot set the value of a LengthField")
예제 #7
0
 def setval(self, *args):
     raise SuitcaseProgrammingError("One does not simply modify Magic")
예제 #8
0
 def setval(self, *args):
     raise SuitcaseProgrammingError("CRC will be set automatically")