practize_1course/automation/decompress.py

56 lines
2.5 KiB
Python
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

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}")