Как определить, какой метод сжатия используется для блока данных?

У меня есть программа, которая читает файлы из старой системы. Одна часть данных в каждом файле (а не весь файл) сжимается с использованием неизвестной схемы сжатия, которую мне нужно знать, как распаковать. У меня есть примеры данных до и после сжатия. Я не уверен, как определить схему сжатия, и надеялся, что кто-нибудь здесь знает, как это понять. Судя по некоторым данным в Google, наиболее распространенной схемой сжатия является кодирование Хаффмана, хотя после ее реализации и тестирования выяснилось, что она не та, которая используется.

Вот пример раздела данных до сжатия (в шестнадцатеричных байтах):

00 00 00 00 FF FF FF FF EC 02 00 00 23 03 00 00 23 03 00 00 03 03 FF FF FF FF FF FF FF FF FF FF FF FF 55 03 00 00 00 00 01 01 09 04 04 04 09 09 09 09 07 09 00 06 00 7C 00 1F 55 01 00 C9 1F 54 01 00 07 00 F7 00 2F 54 53 01 00 05 11 54 3D 00 2F 53 52 01 00 03 11 53 57 00 4F 53 53 52 51 01 00 01 20 52 53 1C 00 6E 53 53 52 52 51 50 01 00 02 1F 00 00 58 00 1F 51 1F 00 08 00 58 00 0E 3C 00 05 3E 00 0F 3A 00 01 00 02 00 03 5D 00 0F 1F 00 FF 63 00 B3 01 0F 02 00 01 05 F0 01 0F 02 00 04 03 2E 02 0F 02 00 06 01 6C 02 0F 02 00 03 50 54 54 54 54 54 01 00 00 00 06 00 42 00 1F 55 01 00 C5 1F 54 01 00 0C 1F 53 01 00 09 4F 54 54 53 52 01 00 07 01 1F 00 1F 51 01 00 05 03 1F 00 1F 50 01 00 03 0F 1F 00 FF C7 0F 0F 02 0B 0F 4D 02 0B 0F 8B 02 0B 0F 02 00 06 50 54 54 54 54 54 54 00 00 00 06 00 83 00 1F 55 01 00 C5 1C 54 01 00 0A E9 00 2A 54 53 01 00 03 2E 00 04 25 00 38 54 53 52 01 00 03 2C 00 03 25 00 66 54 54 54 53 52 51 01 00 03 2A 00 03 25 00 00 27 00 44 53 52 51 50 01 00 03 28 00 03 25 00 2B 52 52 1F 00 02 02 00 03 25 00 2F 51 51 1F 00 03 04 02 00 0F 1F 00 FF 89 00 BD 01 0F 02 00 01 02 D1 01 00 F9 01 0F 02 00 03 00 0F 02 00 35 02 0F 02 00 05 01 6F 02 0F 02 00 03 50 54 54 54 54 54 A7 00 00 00 0B 00 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 12 13 14 15 17 17 17 17 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 11 13 14 16 17 17 17 17 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 13 17 17 17 17 17 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 12 16 17 17 16 16 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 12 16 16 16 15 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 13 15 15 14 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 13 14 14 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 11 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10

а вот тот же раздел после сжатия:

E2 00 00 00 00 FF FF FF FF EC 02 00 00 23 03 04 00 20 03 03 12 00 04 02 00 20 55 03 24 00 F1 85 01 01 09 04 04 04 09 09 09 09 07 09 00 06 00 7C 00 1F 55 01 00 C9 1F 54 01 00 07 00 F7 00 2F 54 53 01 00 05 11 54 3D 00 2F 53 52 01 00 03 11 53 57 00 4F 53 53 52 51 01 00 01 20 52 53 1C 00 6E 53 53 52 52 51 50 01 00 02 1F 00 00 58 00 1F 51 1F 00 08 00 58 00 0E 3C 00 05 3E 00 0F 3A 00 01 00 02 00 03 5D 00 0F 1F 00 FF 63 00 B3 01 0F 02 00 01 05 F0 01 0F 02 00 04 03 2E 02 0F 02 00 06 01 6C 02 0F 02 00 03 50 54 54 54 54 54 01 00 00 00 06 00 42 84 00 10 C5 84 00 90 0C 1F 53 01 00 09 4F 54 54 7E 00 F0 02 07 01 1F 00 1F 51 01 00 05 03 1F 00 1F 50 01 00 03 56 00 D0 C7 0F 0F 02 0B 0F 4D 02 0B 0F 8B 02 0B 51 00 02 4A 00 11 54 4A 00 12 83 4A 00 80 1C 54 01 00 0A E9 00 2A CD 00 71 03 2E 00 04 25 00 38 51 00 80 03 2C 00 03 25 00 66 54 5F 00 50 51 01 00 03 2A 0F 00 51 00 27 00 44 53 D3 00 20 03 28 10 00 70 2B 52 52 1F 00 02 02 0B 00 90 2F 51 51 1F 00 03 04 02 00 79 00 30 89 00 BD C8 00 60 01 02 D1 01 00 F9 0A 00 60 03 00 0F 02 00 35 CE 00 30 05 01 6F 07 00 03 D5 00 7A A7 00 00 00 0B 00 10 01 00 8A 12 13 14 15 17 17 17 17 16 00 5F 10 11 13 14 16 17 00 00 30 10 10 13 16 00 0C 2E 00 80 10 10 12 16 17 17 16 16 0A 00 0A 02 00 5A 12 16 16 16 15 13 00 01 02 00 41 13 15 15 14 09 00 0B 02 00 2F 13 14 17 00 02 0F 02 00 06 1A 11 1A 00 50 10 10 10 10 10

Вот что я знаю об этих данных:

-Длина данных после сжатия является переменной.

-Для данных нет общего префикса (первый байт варьируется).

Я был бы очень признателен, если бы кто-нибудь помог мне определить используемую схему сжатия или даже указал мне правильное направление.

Ищите инструменты для решения этой проблемы.

user24714692 28.05.2024 01:26

Почему вы удалили данные из своего вопроса?

Unmitigated 28.05.2024 04:52

Потому что кто-то, с кем я работаю, может распознать шаблон данных, и тогда меня уволят [смайлик со смехом и слезами]

Lan Tanben 28.05.2024 15:09

Мне также кажется, что это вопрос об очень конкретном сценарии, который не будет актуален ни для кого другого. Это не позволит мне удалить вопрос, и это нормально, поэтому я просто попытался удалить конкретные/потенциально конфиденциальные данные.

Lan Tanben 28.05.2024 15:13

@LanTanben Теперь, когда у вас есть ответ, я предлагаю создать искусственные данные, выбрав произвольную последовательность байтов и затем применив к ней lz4!

Stef 28.05.2024 17:53
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
3
5
77
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Это вывод lz4 с удаленными некоторыми байтами. Если я использую lz4 -l (устаревший) при вводе, а затем удаляю первые восемь байтов, я получаю именно ваш результат.

Привет! Не могли бы вы описать процесс, который привел вас к этому ответу? Вы узнали кодировку lz4? Или вы попробовали несколько программ кодирования, чтобы увидеть, какая из них совпала?

Stef 28.05.2024 08:21

Спасибо за ответ! Я тестировал его, используя только базовый LZ4, и он работал со всеми протестированными мной файлами (около 15 000). Мне даже не пришлось удалять первые восемь байтов.

Lan Tanben 28.05.2024 15:12

Я заметил много байтов 0 и 1 в сжатых данных, что указывает на довольно плохое сжатие. Это побудило меня попробовать lz4, один из немногих широко используемых компрессоров с таким сжатием в обмен на его очень высокую скорость.

Mark Adler 28.05.2024 17:08

Интересный. Спасибо за понимание. И еще раз спасибо за помощь мне. Вероятно, мне потребовались бы недели проб и ошибок, чтобы понять это, если предположить, что я в конечном итоге это сделал.

Lan Tanben 28.05.2024 19:32

Другие вопросы по теме