байты python3 заменяют% 3D на = в конце файла настолько быстро, насколько это возможно - PullRequest
0 голосов
/ 12 мая 2018

У меня есть объект байтов, который на самом деле является файлом в формате dataurl.Это около 500 кб.

Мне нужно отбросить 37 байт заголовка (я сделал это с помощью среза) и заменить% 3D на = в конце файла (эту последовательность можно найти 0-2 раза).

Urllib.parse изменяет все записи в объекте.

Есть ли прекрасный способ обработать этот объект?

    content_length = int(self.headers['Content-Length']) # <--- Gets the size of data
    post_body = self.rfile.read(content_length) # <--- Gets the data itself
    print(len(post_body))
    with open("1111", "wb") as fd:
        fd.write(post_body)

    post_body = post_body[37:len(post_body)]

    with open("decoded.png", "wb") as fh:
        fh.write(base64.decodebytes(post_body))

В последней строке у меня возникла проблема.

'=' символы могут быть добавлены, чтобы сделатьпоследний блок содержит четыре символа base64.Но в почтовом запросе у меня есть% 3D вместо =

1 Ответ

0 голосов
/ 12 мая 2018

Мне кажется, что вам нужно "заключить в кавычки" символы экранированного URL (%xx).

Python имеет функцию для этого, в python2.7 это urllib.unquote, в python3 это urllib.parse.unquote.Пример использования:

from urllib.parse import unquote

post_body = unquote(post_body[37:])
  # my_list[i:] is short for my_list[i:len(my_list)]

Однако я не знаю, можете ли вы применить его только к последним байтам или применять только, если байты заканчиваются на %3D ..., для которыхВы можете использовать .endswith(), который работает для одинаковых строк и байтов:

my_bytes.endswith('%3D')
...