Как сопоставить формат сжатия для конкретных сжатых данных?Python

Программы на Python
Ответить
Anonymous
 Как сопоставить формат сжатия для конкретных сжатых данных?

Сообщение Anonymous »

Я пытаюсь распаковать и повторно сжать определенный фрагмент сжатых данных в Python, чтобы воспроизвести исходный сжатый результат. Однако мне не удалось добиться соответствия с zlib, и я не уверен, какой метод или параметры сжатия использовались для исходных сжатых данных.
Вот код, который я использую:
import zlib

original_compress = '78010dc2390a80400c05d052b4d4ce4a3c8024933fdb719259c046c1c2f32bbc696ba098cd92b23242ed66625db568498d106d5e22e0202e4b622f082c24eba0577deeb3eee34bfe20fa7df036131b0000f53a00000000'

print('original_compress:', original_compress)

# Decompress the data
decompress = zlib.decompress(bytes.fromhex(original_compress))
print('decompress:', decompress.hex())

# Recompress the data
again_compress = zlib.compress(decompress)
print('again_compress:', again_compress.hex())

# Compare the results
if original_compress == again_compress.hex():
print('Matched')
else:
print('NotMatched')

Проблема:
Распаковка работает нормально с zlib, поэтому я предполагаю, что это формат, совместимый с zlib.
Однако повторное сжатие не дает результата побайтовое совпадение с исходными данными.
Наблюдения:
Исходные сжатые данные начинаются с 78 01, что предполагает использование заголовка zlib (возможно, DEFLATE без сжатия).
Распакованные данные действительны, и я могу подтвердить целостность распаковки.
Вопросы:
Как я могу воспроизвести точный исходный сжатый результат? Существуют ли определенные параметры или флаги, которые мне нужно использовать с zlib?
Могут ли исходные данные использовать специальную или нестандартную реализацию сжатия? Если да, то как я могу это определить?
Существуют ли какие-либо инструменты или библиотеки (помимо zlib), которые могут помочь мне перепроектировать используемый формат сжатия?
import ctypes

# Load the compiled miniz DLL for Windows
miniz = ctypes.CDLL("C:/Users/neatbox/miniz/miniz.dll")

# Define function signatures for decompression and compression
miniz.mz_compress2.argtypes = [ctypes.c_void_p, ctypes.POINTER(ctypes.c_ulong), ctypes.c_void_p, ctypes.c_ulong, ctypes.c_int]
miniz.mz_compress2.restype = ctypes.c_int

miniz.mz_uncompress.argtypes = [ctypes.c_void_p, ctypes.POINTER(ctypes.c_ulong), ctypes.c_void_p, ctypes.c_ulong]
miniz.mz_uncompress.restype = ctypes.c_int

# Decompress using miniz
def decompress_miniz(data):
source = ctypes.create_string_buffer(data)
source_len = len(data)
dest_len = ctypes.c_ulong(source_len * 4) # Allocate more space for decompressed data
dest = ctypes.create_string_buffer(dest_len.value)

result = miniz.mz_uncompress(dest, ctypes.byref(dest_len), source, source_len)
if result != 0:
raise RuntimeError("Decompression failed")
return dest.raw[:dest_len.value]

# Compress using miniz with the default compression level
def compress_miniz(data, level=1):
source = ctypes.create_string_buffer(data)
source_len = len(data)
dest_len = ctypes.c_ulong(source_len * 2) # Allocate more space for compressed data
dest = ctypes.create_string_buffer(dest_len.value)

result = miniz.mz_compress2(dest, ctypes.byref(dest_len), source, source_len, level)
if result != 0:
raise RuntimeError("Compression failed")
return dest.raw[:dest_len.value]

# Original compressed data
original_compress = bytes.fromhex(
'78010dc2390a80400c05d052b4d4ce4a3c8024933fdb719259c046c1c2f32bbc696ba098cd92b23242ed66625db568498d106d5e22e0202e4b622f082c24eba0577deeb3eee34bfe20fa7df036131b0000f53a00000000'
)

print(f"Original Compressed Data (hex): {original_compress.hex()}")
print(f"Original Compressed Length: {len(original_compress)} bytes")

# Step 1: Decompress
try:
decompressed = decompress_miniz(original_compress)
print(f"Decompressed Data (hex): {decompressed.hex()}")
print(f"Decompressed Length: {len(decompressed)} bytes")
except RuntimeError as e:
print(f"Decompression failed: {e}")
exit()

# Step 2: Recompress
try:
#print(f"{compress_miniz(decompressed)} aaa")
recompressed = compress_miniz(decompressed)
print(f"Recompressed Data (hex): {recompressed.hex()}")
print(f"Recompressed Length: {len(recompressed)} bytes")

# Step 3: Check if recompressed matches the original
if recompressed == original_compress:
print("Matched")
else:
print("NotMatched")
except RuntimeError as e:
print(f"Compression failed: {e}")


Подробнее здесь: https://stackoverflow.com/questions/792 ... essed-data
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «Python»