def write_string(self, value: str) -> None: self.__size = align_offset_to_type(self.__size, FieldTypes.TYPE_STRING) self.__writer.seek(self.__size) str_size = len(value) self.write_uint32(str_size) self.__writer.write(bytes(value, 'utf-8')) self.__size += str_size
def write_bytes(self, value: bytes) -> None: self.__size = align_offset_to_type(self.__size, FieldTypes.TYPE_BYTES) self.__writer.seek(self.__size) bytes_size = len(value) self.write_uint32(bytes_size) self.__writer.write(value) self.__size += bytes_size
def read_bytes(self) -> bytes: self.__cursor = align_offset_to_type(self.__cursor, FieldTypes.TYPE_BYTES) self.__reader.seek(self.__cursor) bytes_length = self.read_uint32() if self.__cursor + bytes_length > self.__size: raise RuntimeError( f'bytes object has an invalid length {self.__size - self.__cursor}, expected {bytes_length}' ) bytes_value = self.__reader.read(bytes_length) self.__cursor += bytes_length return bytes_value
def read_string(self) -> str: self.__cursor = align_offset_to_type(self.__cursor, FieldTypes.TYPE_STRING) self.__reader.seek(self.__cursor) str_length = self.read_uint32() if self.__cursor + str_length > self.__size: raise RuntimeError( f'str object has an invalid length {self.__size - self.__cursor}, expected {str_length}' ) str_bytes = self.__reader.read(str_length) str_value = str(str_bytes, 'utf-8') self.__cursor += str_length return str_value
def read_uint64(self) -> int: self.__cursor = align_offset_to_type(self.__cursor, FieldTypes.TYPE_UINT64) self.__reader.seek(self.__cursor) if self.__cursor + FIELD_SIZES[FieldTypes.TYPE_UINT64] > self.get_size( ): raise RuntimeError( f'cannot read uint64 type, expected {FIELD_SIZES[FieldTypes.TYPE_UINT64]} bytes' ) uint64_bytes = self.__reader.read(FIELD_SIZES[FieldTypes.TYPE_UINT64]) uint64_value = int.from_bytes(uint64_bytes, byteorder='little', signed=False) self.__cursor += FIELD_SIZES[FieldTypes.TYPE_UINT64] return uint64_value
def write_uint64(self, value: int) -> None: self.__size = align_offset_to_type(self.__size, FieldTypes.TYPE_UINT64) self.__writer.seek(self.__size) formatted_uint64 = value.to_bytes(8, byteorder='little', signed=False) self.__writer.write(formatted_uint64) self.__size += FIELD_SIZES[FieldTypes.TYPE_UINT64]