Правильно ли я извлекаю двоичные данные JPEG из этого mysqldump? - PullRequest
2 голосов
/ 27 апреля 2010

У меня есть очень старая резервная копия .sql сайта vbulletin, который я запускал около 8 лет назад. Я пытаюсь увидеть файловые вложения, которые хранятся в БД. Приведенный ниже скрипт извлекает их все и проверяется как JPEG с помощью шестнадцатеричного дампа и проверки байтов SOI (начало изображения) и EOI (конец изображения) (FFD8 и FFD9 соответственно) в соответствии с JPEG вики-страницей .

Но когда я пытаюсь открыть их с помощью evince, я получаю сообщение «Ошибка интерпретации файла изображения JPEG (поток данных JPEG не содержит изображения)»

Что здесь может происходить?

Некоторая справочная информация:

  • sqldump около 8 лет
  • vbulletin 2.x - программа, хранящая информацию
  • скорее всего был использован php 4
  • Скорее всего, MySQL 4.0, возможно, даже 3.x
  • тип столбца, в котором хранятся эти вложения, - в среднем тексте

Мой скрипт на Python 3.1:

#!/usr/bin/env python3.1

import re

trim_l = re.compile(b"""^INSERT INTO attachment VALUES\('\d+', '\d+', '\d+', '(.+)""")
trim_r = re.compile(b"""(.+)', '\d+', '\d+'\);$""")
extractor = re.compile(b"""^(.*(?:\.jpe?g|\.gif|\.bmp))', '(.+)$""")

with open('attachments.sql', 'rb') as fh:
    for line in fh:
        data = trim_l.findall(line)[0]
        data = trim_r.findall(data)[0]
        data = extractor.findall(data)
        if data:
            name, data = data[0]
            try:
                filename = 'files/%s' % str(name, 'UTF-8')
                ah = open(filename, 'wb')
                ah.write(data)
            except UnicodeDecodeError:
                continue
            finally:
                ah.close()

fh.close()

обновление На вики-странице JPEG написано, что байты FF являются маркерами раздела, а следующий байт указывает тип раздела. Я вижу некоторые из них, которых нет в вики-странице (в частности, я вижу много 5-байтовых байтов, поэтому FF5C). Но список "общих маркеров", поэтому я пытаюсь найти более полный список. Любое руководство здесь также будет оценено.

1 Ответ

1 голос
/ 28 апреля 2010

Обновите ваш вопрос с помощью примера оператора SQL, включая несколько строк / байтов строкового значения JPEG. Возможно, данные в кодировке base64 или даже прямые шестнадцатеричные значения. Мы поможем вам дальше.

Кроме того, легче увидеть тип содержимого файла, введя:

file yourfile.jpg
...