56 lines
2.5 KiB
Python
56 lines
2.5 KiB
Python
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}")
|