"""Read-write utility functions.""" import struct import typing class EndianIO: UCHAR = struct.Struct(b'= fieldlen: to_write = data[0:fieldlen] else: to_write = data + b'\0' fileobj.write(to_write) @classmethod def read_bytes0(cls, fileobj, length): data = fileobj.read(length) return cls.read_data0(data) @classmethod def read_data0_offset(cls, data, offset): add = data.find(b'\0', offset) - offset return data[offset:offset + add] @classmethod def read_data0(cls, data): add = data.find(b'\0') if add < 0: return data return data[:add] class LittleEndianTypes(EndianIO): pass class BigEndianTypes(LittleEndianTypes): UCHAR = struct.Struct(b'>B') USHORT = struct.Struct(b'>H') USHORT2 = struct.Struct(b'>HH') # two shorts in a row SSHORT = struct.Struct(b'>h') UINT = struct.Struct(b'>I') SINT = struct.Struct(b'>i') FLOAT = struct.Struct(b'>f') ULONG = struct.Struct(b'>Q')