Извлечение файла .Thumbdata3. TypeError: требуется байтоподобный объект, а не 'str' - PullRequest
0 голосов
/ 25 апреля 2018

Я знаю, что есть похожие темы, и я их просмотрел, но они не помогли мне:

Некоторое время назад я сохранил два файла .thumbdata3, каждый размером около 500 МБ., Этот поток обмена стеками утверждал, что я могу извлечь небольшие jpegs из файлов, используя скрипт python:

#!/usr/bin/python

"""extract files from Android thumbdata3 file"""

f=open('thumbdata3.dat','rb')
tdata = f.read()
f.close()

ss = '\xff\xd8'
se = '\xff\xd9'

count = 0
start = 0
while True:
    x1 = tdata.find(ss,start)
    if x1 < 0:
        break
    x2 = tdata.find(se,x1)
    jpg = tdata[x1:x2+1]
    count += 1
    fname = 'extracted%d03.jpg' % (count)
    fw = open(fname,'wb')
    fw.write(jpg)
    fw.close()
    start = x2+2

Однако он вернул эту ошибку:

Traceback (most recent call last):
  File "... extract.py", line 15, in <module>
    x1 = tdata.find(ss,start)
TypeError: a bytes-like object is required, not 'str'

После поиска вокругЯ подумал, что ошибка может быть между использованием методологии 2.7 и 3.5, и изменил 'rb' в функции f.open на 'r' только для того, чтобы получить эту ошибку:

Traceback (most recent call last):
  File "...\Thumbdata\thumbadata extract.py", line 6, in <module>
    tdata = f.read()
  File "...\Anaconda3\lib\encodings\cp1252.py", line 23, in decode
    return codecs.charmap_decode(input,self.errors,decoding_table)[0]
UnicodeDecodeError: 'charmap' codec can't decode byte 0x81 in position 277960004: character maps to <undefined>

Стоит отметить, что скрипт и файл находятся в одной папке.Я использую Atom с пакетом запуска Python, а также Anaconda3.

Любая помощь приветствуется.

1 Ответ

0 голосов
/ 18 апреля 2019

Вы должны продолжать использовать режим rb для чтения двоичных файлов в f = open ('thumbdata3.dat', 'rb') для чтения этих двоичных данных.

Проблема в том, что f - это двоичный поток, тогда функция find ожидает параметр байтового типа, который является новым в Python3.

ss и se были назначены в качестве строкового значения, поэтому его тип - строка (я думаю, ss и se обозначают строку начало и конец строки).

Вам необходимо закодировать эти строки в двоичный тип, используя encode () function:

x1 = tdata.find(ss.encode(),start)

x2 = tdata.find(se.encode(),x1)

Пожалуйста, проверьте и прокомментируйте вывод, чтобы убедиться, что он будет работать.

...