import base64 import zlib def decompress_wolfram_data(compressed_str: str) -> str: """Декодирует и распаковывает строку CompressedData из Wolfram Mathematica.""" # 1. Удаляем пробелы, переносы строк и префикс версии (например, "1:") cleaned_str = "".join(compressed_str.split()) if ":" in cleaned_str: cleaned_str = cleaned_str.split(":", 1)[1] # 2. Алфавиты: Wolfram использует отличный от стандартного Base64 набор символов # Стандартный: 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/' wolfram_alphabet = ( "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789+/" ) standard_alphabet = ( "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/" ) # Создаем таблицу перевода символов из Wolfram в стандартный Base64 translation_table = str.maketrans(wolfram_alphabet, standard_alphabet) standard_b64_str = cleaned_str.translate(translation_table) # 3. Добавляем паддинг '=', если длина строки не кратна 4 padding_needed = len(standard_b64_str) % 4 if padding_needed: standard_b64_str += "=" * (4 - padding_needed) # 4. Декодируем из Base64 в байты binary_data = base64.b64decode(standard_b64_str) # 5. Распаковываем с помощью zlib (алгоритм Deflate) decompressed_bytes = zlib.decompress(binary_data) # Возвращаем результат в виде текстовой строки return decompressed_bytes.decode("utf-8", errors="ignore") # === ПРИМЕР ИСПОЛЬЗОВАНИЯ === if __name__ == "__main__": # Пример сжатой строки из Mathematica (результат Compress["Hello World! This is Wolfram compression."]) wolfram_data = """ 1:eJxVjDEOwjAMRaGSgYmJgYmBiaUrV65wAsbChMTgAtS9W9SptfS97+f79Wev bX6fLhXF6Kx0Y9WSpM/fXstxmsv9uE3p2SgUizWclE3Z6p38g2bE9Y6g8w2VgG6A """ wolfram_data = input("Enter wolfram compressed data string:\n") try: result = decompress_wolfram_data(wolfram_data) print("Успешно распаковано!") print("-" * 30) print(result) print("-" * 30) except Exception as e: print(f"Ошибка при распаковке: {e}")