Не удается найти заголовки jpg при чтении необработанного образа диска (dd) - PullRequest
0 голосов
/ 20 февраля 2020

Я читаю необработанный образ диска, используя python 3. Моя задача - извлечь (вырезать) jpgs как отдельные файлы из образа диска. Как я знаю шаблон заголовка (\xd8\xff\xe0 или \xd8\xff\xe1) из JPG. Я хочу знать, где я получаю это при чтении файла.

fobj = open('carve.dd', 'rb')
data = fobj.read(32)

while data != '':
 head_loc = findheader(data)
 print(head_loc)
 data = fobj.read(32)

def findheader(data) :  # to find header in each 32 bytes of data of raw disk image
 for i in range(0, len(data) - 3) :
  if data[i] == b'\xff' :
    if data[i+1:i+4] == b'\xd8\xff\xe0' or data[i+1:i+4] == b'\xd8\xff\xe1' :
      return i
 return -1

Тот же код отлично работает в Python 2. В Python 2 я могу получить заголовки всего за несколько секунд из изображения. Может кто-нибудь помочь мне, в чем проблема в Python 3?

Этот фрагмент кода на самом деле из этого https://github.com/darth-cheney/JPEG-Recover/blob/master/jpegrecover2.py Это отлично работает в Python 2, но не в Python 3. Пожалуйста, забудьте о несогласованной ошибке табуляции при запуске кода по ссылке . Я снова набрал код VS.

1 Ответ

1 голос
/ 23 февраля 2020

Как гласит старая поговорка, у меня есть плохие новости и хорошие новости. Плохо то, что я не могу понять, почему ваш код не работает одинаково как в версии 2, так и в версии 3 Python.

. Хорошо, что я смог воспроизвести проблему, используя пример данные, которые вы предоставили, но, что более важно, способны разработать что-то, что не только работает согласованно в обеих версиях, но, скорее всего, намного быстрее, потому что не использует for l oop для поиска в каждой кусок данных ищет шаблоны заголовков .jpg.

from __future__ import print_function

LIMIT = 100000  # Number of chunks (for testing).
CHUNKSIZE = 32  # Bytes.
HDRS = b'\xff\xd8\xff\xe0', b'\xff\xd8\xff\xe1'
IMG_PATH = r'C:\vols\Files\Temp\carve.dd.002'

print('Searching...')
with open(IMG_PATH, 'rb') as file:
    chunk_index = 0
    found = 0
    while True:
        data = file.read(CHUNKSIZE)
        if not data:
            break

        # Search for each of the headers in each chunk.
        for hdr in HDRS:
            offset = 0
            while offset < (CHUNKSIZE - len(hdr)):
                try:
                    head_loc = data[offset:].index(hdr)
                except ValueError:  # Not found.
                    break
                found += 1
                file_offset = chunk_index*CHUNKSIZE + head_loc
                print('found: #{} at {:,}'.format(found, file_offset))
                offset += (head_loc + len(hdr))

        chunk_index += 1
        if LIMIT and (chunk_index == LIMIT): break  # Stop after this many chunks.

print('total found {}'.format(found))
...