Вы хотите перепроектировать структуру двоичного файла с помощью Python. Поскольку вы заявили, что файл двоичный, это может оказаться затруднительным. Вам нужно будет изучить содержимое файла и использовать свою лучшую интуицию, чтобы попытаться вывести структуру. Первое, что вам нужно - это способ отображения каждого из байтов файла способом, который поможет вам понять смысл.
К счастью, кто-то уже написал инструмент для этого, hexdump. Установите этот пакет с помощью pip.
Функция, в которой вы нуждаетесь, это hexdump, поэтому давайте импортируем ее в пакет и получим справку по этой функции.
>>> import hexdump
>>> help(hexdump.hexdump)
Help on function hexdump in module hexdump:
hexdump(data, result='print')
Transform binary data to the hex dump text format:
00000000: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................
[x] data argument as a binary string
[x] data argument as a file like object
Returns result depending on the `result` argument:
'print' - prints line by line
'return' - returns single string
'generator' - returns generator that produces lines
Теперь вы можете начать изучение содержимого своего файла. Используйте оператор среза, чтобы сделать это в кусках. Например, для отображения содержимого первого 1KB вашего файла:
>>> hexdump.hexdump(buf[:1024])
00000000: C3 8E C2 8F 22 13 C2 AA 66 2A 22 47 C3 94 C3 AA ...."...f*"G....
00000010: C3 89 C3 A0 C3 B1 C3 91 6A C2 A4 C3 BF 3C C2 AA ........j....<..
00000020: C2 91 73 C3 85 46 57 47 C2 88 C3 99 C2 B6 3E 2D ..s..FWG......>-
00000030: C3 BA 69 10 C2 93 C3 94 38 C3 81 7A 6A 43 30 7C ..i.....8..zjC0|
00000040: C3 BB C2 AA 01 2D C2 97 C3 83 C3 88 64 14 C3 9C .....-......d...
00000050: C2 AB C2 AA C3 A2 74 C2 85 5D C3 97 4E 64 68 C3 ......t..]..Ndh.
...
000003C0: 42 C2 8F 06 7F 12 33 7F 79 1E 2C 2A 0F C3 92 36 B.....3.y.,*...6
000003D0: C3 A6 C2 96 C2 93 C2 8B 43 C2 9F 4C C2 95 48 24 ........C..L..H$
000003E0: C2 B3 C2 82 26 C3 88 C3 BD C3 96 12 1E 5E 18 2E ....&........^..
000003F0: 37 C3 A7 C2 87 C3 AE 00 4F 3F C2 9C C3 A8 1C C2 7.......O?......
HexDump имеет хорошее свойство делает позицию байта, шестнадцатеричный код, а затем (если это возможно) печатаемую форма символа на право.
Будем надеяться, что некоторые из ваших текстовых значений будут видны там, и это даст некоторое представление о том, как перепроектировать ваш файл.
Как только вы начали определять, как структурирован ваш файл, вы можете использовать различные строковые операторы для управления вашими данными. Например, если вы обнаружите, что ваш файл разбивается на разделы по нулевой байт (b'\x00'
), вы можете получить эти участки таким образом:
>>> sections = buf.split(b'\x00')
Есть много вещей, которые вы, вероятно, придется учиться как вы копаете глубже, как кодировки символов, кодировки чисел (в том числе little-endian для целых чисел и с плавающей запятой для чисел с плавающей запятой). Вы захотите найти какой-то способ внешне подтвердить свои результаты.
Удачи.
Рад слышать, что вы используете Python 3. –