У меня есть программа, которая читает файлы из старой системы. Одна часть данных в каждом файле (а не весь файл) сжимается с использованием неизвестной схемы сжатия, которую мне нужно знать, как распаковать. У меня есть примеры данных до и после сжатия. Я не уверен, как определить схему сжатия, и надеялся, что кто-нибудь здесь знает, как это понять. Судя по некоторым данным в 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
Вот что я знаю об этих данных:
-Длина данных после сжатия является переменной.
-Для данных нет общего префикса (первый байт варьируется).
Я был бы очень признателен, если бы кто-нибудь помог мне определить используемую схему сжатия или даже указал мне правильное направление.
Почему вы удалили данные из своего вопроса?
Потому что кто-то, с кем я работаю, может распознать шаблон данных, и тогда меня уволят [смайлик со смехом и слезами]
Мне также кажется, что это вопрос об очень конкретном сценарии, который не будет актуален ни для кого другого. Это не позволит мне удалить вопрос, и это нормально, поэтому я просто попытался удалить конкретные/потенциально конфиденциальные данные.
@LanTanben Теперь, когда у вас есть ответ, я предлагаю создать искусственные данные, выбрав произвольную последовательность байтов и затем применив к ней lz4!
Это вывод lz4 с удаленными некоторыми байтами. Если я использую lz4 -l
(устаревший) при вводе, а затем удаляю первые восемь байтов, я получаю именно ваш результат.
Привет! Не могли бы вы описать процесс, который привел вас к этому ответу? Вы узнали кодировку lz4? Или вы попробовали несколько программ кодирования, чтобы увидеть, какая из них совпала?
Спасибо за ответ! Я тестировал его, используя только базовый LZ4, и он работал со всеми протестированными мной файлами (около 15 000). Мне даже не пришлось удалять первые восемь байтов.
Я заметил много байтов 0 и 1 в сжатых данных, что указывает на довольно плохое сжатие. Это побудило меня попробовать lz4, один из немногих широко используемых компрессоров с таким сжатием в обмен на его очень высокую скорость.
Интересный. Спасибо за понимание. И еще раз спасибо за помощь мне. Вероятно, мне потребовались бы недели проб и ошибок, чтобы понять это, если предположить, что я в конечном итоге это сделал.
Ищите инструменты для решения этой проблемы.