Пример #1
0
class CPIOFileHeader(binobj.Struct):
    magic = fields.UInt16(const=0o070707, discard=True, endian="little")
    device_id = fields.UInt16(default=0, endian="little")
    inumber = fields.UInt16(default=0, endian="little")
    mode = fields.UInt16(default=0o644, endian="little")
    owner_uid = fields.UInt16(default=0, endian="little")
    owner_gid = fields.UInt16(default=0, endian="little")
    n_links = fields.UInt16(default=0, endian="little")
    device_version = fields.UInt16(default=0, endian="little")
    modified_time = fields.Timestamp32(default=_NOW, tz_aware=True, endian="little")
    name_size = fields.UInt16(endian="little")
    file_size = fields.UInt32(endian="little")
    filename = fields.StringZ(encoding="utf-8")
    _filename_padding = fields.Bytes(
        const=b"\0", discard=True, present=lambda f, *_: f["name_size"] % 2
    )
    data = fields.Bytes(size=file_size)

    @name_size.computes
    def _name_size(self, all_fields):
        return len((all_fields["filename"] + "\0").encode("utf-8"))

    @file_size.computes
    def _file_size(self, all_fields):
        return len(all_fields["data"])
Пример #2
0
    class Class(binobj.Struct):
        string = fields.StringZ()
        integer = fields.Int8()

        @decorators.validates("integer")
        def validator(self, field, value):
            if value > 126:
                raise errors.ValidationError("high", field=field, value=value)
Пример #3
0
def test_dump__null_with_default_and_varlen():
    """Crash if trying to write ``None`` when using the default null_value and
    field has no defined size."""
    field = fields.StringZ(name="field", null_value=DEFAULT)
    assert field.allow_null is True

    with pytest.raises(errors.UnserializableValueError):
        field.to_bytes(None)
Пример #4
0
class FieldsUnionContainer(binobj.Struct):
    data_type = fields.UInt8()
    item = fields.Union(
        fields.StringZ(),
        fields.UInt16(endian="little"),
        load_decider=fields_load_decider,
        dump_decider=fields_dump_decider,
    )
Пример #5
0
class CircularReferenceComputedSize(binobj.Struct):
    """A struct with a size field and array that reference each other."""

    count = fields.UInt16(endian="big")
    stuff = fields.Array(fields.StringZ(), count=count)

    @count.computes
    def compute_count(self, all_fields):
        return len(all_fields["stuff"])
Пример #6
0
class ComputedLengthStruct(binobj.Struct):
    """A struct whose length can be computed if values are defined."""

    int_value = fields.UInt32()
    value = fields.StringZ()

    @value.computes
    def _compute_value(self, all_fields):
        return str(all_fields["int_value"])
Пример #7
0
    class Class(binobj.Struct):
        text = fields.StringZ(validate=alnum_validator)

        @decorators.validates("text")
        def validate_text(self, field, value):
            if len(value) % 2 != 0:
                raise errors.ValidationError("Invalid length.",
                                             field=field,
                                             value=value)
Пример #8
0
    class Class(binobj.Struct):
        string = fields.StringZ()
        integer = fields.Int8()

        @decorators.validates_struct
        def validator(self, dct):
            if dct["string"] != str(dct["integer"]):
                raise errors.ValidationError("Strings not equal",
                                             field="integer",
                                             value=dct["integer"])
Пример #9
0
class BasicPresentStruct(binobj.Struct):
    flags = fields.UInt16(endian="little")
    thing = fields.StringZ(present=lambda f, *_: f["flags"] & 0x8000)
    other_thing = fields.UInt16(const=0x1234, endian="little")

    @flags.computes
    def _flags(self, all_values):
        existing = all_values.get("flags", 0)
        if "thing" in all_values:
            return existing | 0x8000
        return existing
Пример #10
0
class InheritedStruct(BasicStruct):
    """Extension of BasicStruct with additional fields."""

    other_string = fields.StringZ(encoding="utf-16-le")
Пример #11
0
class StringZTestStruct(binobj.Struct):
    header = fields.UInt32()
    string = fields.StringZ()
    trailer = fields.UInt16()
Пример #12
0
    class Class(binobj.Struct):
        text = fields.StringZ()

        @decorators.validates("text")
        def validate_text(self, field, value):
            alnum_validator(field, value)
Пример #13
0
 class Class(binobj.Struct):
     text = fields.StringZ(validate=alnum_validator)
Пример #14
0
def test_const_set_size__stringz():
    """Variable-length strings MUST set their size with ``const``."""
    field = fields.StringZ(const="asdf")
    assert field.size is not None, "Size wasn't set."
    assert field.size == 5, "Size is incorrect."
Пример #15
0
def test_const_set_size__stringz_utf16():
    """Variable-length strings MUST set their size with ``const``."""
    field = fields.StringZ(const="wxyz", encoding="utf-16")
    assert field.size is not None, "Size wasn't set."
    assert field.size == 12, "Size is incorrect."
Пример #16
0
class UnionItemA(binobj.Struct):
    _id = fields.UInt8(const=0xFF)
    value = fields.StringZ()
Пример #17
0
def test_array__unsized_dump_ok():
    field = fields.Array(fields.StringZ())
    assert field.to_bytes(["abc", "123456"]) == b"abc\x00123456\0"
Пример #18
0
def test_array__sized_dump_ok(iterable):
    """Write a sized array with the expected number of values."""
    field = fields.Array(fields.StringZ(), count=2)
    assert field.to_bytes(iterable) == b"abc\x00123456\0"