"""Read-write utility functions.""" import struct import typing class 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') def write_string(fileobj: typing.BinaryIO, astring: str, fieldlen: int): assert isinstance(astring, str) write_bytes(fileobj, astring.encode('utf-8'), fieldlen) def write_bytes(fileobj: typing.BinaryIO, data: bytes, fieldlen: int): assert isinstance(data, (bytes, bytearray)) if len(data) >= fieldlen: to_write = data[0:fieldlen] else: to_write = data + b'\0' fileobj.write(to_write) def read_bytes0(fileobj, length): data = fileobj.read(length) return read_data0(data) def read_string(fileobj, length): return fileobj.read(length).decode('utf-8') def read_string0(fileobj, length): return read_bytes0(fileobj, length).decode('utf-8') def read_data0_offset(data, offset): add = data.find(b'\0', offset) - offset return data[offset:offset + add] def read_data0(data): add = data.find(b'\0') return data[:add]