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"])
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)
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)
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, )
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"])
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"])
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)
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"])
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
class InheritedStruct(BasicStruct): """Extension of BasicStruct with additional fields.""" other_string = fields.StringZ(encoding="utf-16-le")
class StringZTestStruct(binobj.Struct): header = fields.UInt32() string = fields.StringZ() trailer = fields.UInt16()
class Class(binobj.Struct): text = fields.StringZ() @decorators.validates("text") def validate_text(self, field, value): alnum_validator(field, value)
class Class(binobj.Struct): text = fields.StringZ(validate=alnum_validator)
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."
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."
class UnionItemA(binobj.Struct): _id = fields.UInt8(const=0xFF) value = fields.StringZ()
def test_array__unsized_dump_ok(): field = fields.Array(fields.StringZ()) assert field.to_bytes(["abc", "123456"]) == b"abc\x00123456\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"