classMetaStringEncoder: def__init__(self, special_char1: str, special_char2: str): """ Creates a MetaStringEncoder with specified special characters used for encoding. Args: special_char1 (str): The first special character used in custom encoding. special_char2 (str): The second special character used in custom encoding. """ self.special_char1 = special_char1 self.special_char2 = special_char2
defencode(self, input_string: str) -> MetaString: """ Encodes the input string into a MetaString object. Args: input_string (str): The string to encode. Returns: MetaString: The encoded MetaString object. """ # Long meta string than _METASTRING_NUM_CHARS_LIMIT is not allowed. assert ( len(input_string) < _METASTRING_NUM_CHARS_LIMIT ), "Long meta string than _METASTRING_NUM_CHARS_LIMIT is not allowed."
defcompute_encoding(self, input_string: str) -> Encoding: """ Determines the encoding type of the input string. Args: input_string (str): The string to be encoded. Returns: Encoding: The encoding type. """ ifnot input_string: return Encoding.LOWER_SPECIAL
defencode_with_encoding(self, input_string: str, encoding: Encoding) -> MetaString: """ Encodes the input string with the specified encoding. Args: input_string (str): The string to encode. encoding (Encoding): The encoding type. Returns: MetaString: An encoded MetaString object. """ # Long meta string than _METASTRING_NUM_CHARS_LIMIT is not allowed. assert ( len(input_string) < _METASTRING_NUM_CHARS_LIMIT ), "Long meta string than _METASTRING_NUM_CHARS_LIMIT is not allowed."
def_encode_generic(self, chars: List[str], bits_per_char: int) -> bytes: """ Generic encoding function for encoding characters into bytes. Args: chars (list): The characters to encode. bits_per_char (int): The number of bits per character. Returns: bytes: The encoded data. """ total_bits = len(chars) * bits_per_char + 1 byte_length = (total_bits + 7) // 8 bytes_array = bytearray(byte_length) current_bit = 1 for c in chars: value = self._char_to_value(c, bits_per_char) for i in range(bits_per_char - 1, -1, -1): if (value & (1 << i)) != 0: byte_pos = current_bit // 8 bit_pos = current_bit % 8 bytes_array[byte_pos] |= 1 << (7 - bit_pos) current_bit += 1 strip_last_char = len(bytes_array) * 8 >= total_bits + bits_per_char if strip_last_char: bytes_array[0] = bytes_array[0] | 0x80 return bytes(bytes_array)
def_char_to_value(self, c: str, bits_per_char: int) -> int: """ Converts a character to its encoded value based on the number of bits per character. Args: c (str): The character to convert. bits_per_char (int): The number of bits per character. Returns: int: The encoded value of the character. """ if bits_per_char == 5: if"a" <= c <= "z": return ord(c) - ord("a") elif c == ".": return26 elif c == "_": return27 elif c == "$": return28 elif c == "|": return29 else: raise ValueError( f"Unsupported character for LOWER_SPECIAL encoding: {c}" ) elif bits_per_char == 6: if"a" <= c <= "z": return ord(c) - ord("a") elif"A" <= c <= "Z": return26 + (ord(c) - ord("A")) elif"0" <= c <= "9": return52 + (ord(c) - ord("0")) elif c == self.special_char1: return62 elif c == self.special_char2: return63 else: raise ValueError( f"Unsupported character for LOWER_UPPER_DIGIT_SPECIAL encoding: {c}" )