Декодировать байты без потери данных

Входные данные представляют собой байтовую переменную со значением b'\x1f\x8b\x08\x00', которую необходимо преобразовать в строку. Ожидаемый результат: '\x1f\x8b\x08\x00'.

Как мне этого добиться?

Я использую zlib для получения входных данных gzip, и мне нужно преобразовать их в строку для браузера, чтобы распаковать.

Я попытался добавить параметр errors='ignore'.

Я попытался указать кодировку «latin1», но браузер не может распаковать данные.

>>> a = b'\x1f\x8b\x08\x00'
>>> z = a.decode('utf-8')
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
UnicodeDecodeError: 'utf-8' codec can't decode byte 0x8b in position 1: invalid start byte
>>> z = a.decode('utf-8', errors = 'ignore')
>>> z
'\x1f\x08\x00'

Ожидаемый результат '\x1f\x8b\x08\x00'


person Anish Chadayappan    schedule 11.11.2019    source источник
comment
Можете ли вы распечатать вывод a, прежде чем пытаться его расшифровать и опубликовать здесь? Возможно, вам потребуется использовать только функцию srt().   -  person Uber    schedule 11.11.2019
comment
print(str(z).strip('b'))? Непонятно, зачем вам нужен этот вывод.   -  person chepner    schedule 11.11.2019
comment
Вы имели в виду a.hex()?   -  person quamrana    schedule 11.11.2019
comment
Вы уверены, что браузер не ожидает, что заархивированные данные будут закодированы в строку base64? Кодировка Base64 — это то, как бинарные BLOB-объекты обычно передаются в веб-мире.   -  person snakecharmerb    schedule 11.11.2019
comment
@chepner: это нужно отправить в браузер. Дополнительный b' вызывает несоответствие длины содержимого. Это сжатый вывод zlib, возвращающий байты.   -  person Anish Chadayappan    schedule 11.11.2019
comment
@Uber: функция str() добавляет дополнительные \ к существующим \. Нужно просто удалить b'   -  person Anish Chadayappan    schedule 11.11.2019
comment
str ничего не добавляет; вы смотрите на результат repr(str(z)), а не на содержимое самой строки.   -  person chepner    schedule 11.11.2019


Ответы (1)


Вы можете преобразовать строку и удалить ненужные символы:

z = b'\x1f\x8b\x08\x00'
a = str(z)[2:-1]
print(a)
print(type(a))

Выход:

\x1f\x8b\x08\x00
<class 'str'>

Использование в Python3.7:

Python 3.7.4 (default, Aug 17 2019, 13:54:58)
[Clang 10.0.1 (clang-1001.0.46.4)] on darwin
Type "help", "copyright", "credits" or "license" for more information.
>>> a = b'\x1f\x8b\x08\x00'
>>> b = str(a)[2:-1]
>>> b
'\\x1f\\x8b\\x08\\x00'
>>> print(b)
\x1f\x8b\x08\x00
>>>
person Maurice Meyer    schedule 11.11.2019
comment
>>> a = b'\x1f\x8b\x08\x00' >>> b = str(a)[2:-1] '\\x1f\\x8b\\x08\\x00' Я ожидаю '\x1f\x8b\x08\x00' - person Anish Chadayappan; 11.11.2019
comment
Двойная обратная косая черта — это внутреннее представление Python! Вам нужно распечатать на стандартный вывод или записать переменную в файл, чтобы увидеть строку как есть. Попробуйте: print(b) - person Maurice Meyer; 11.11.2019
comment
Вы видите разницу между простым вызовом b и print(b)... - person Maurice Meyer; 11.11.2019