【问题标题】:Decode bytes without losing data解码字节而不丢失数据
【发布时间】:2019-11-11 13:47:52
【问题描述】:

输入是一个字节变量,值为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'

【问题讨论】:

  • 你能在尝试解码之前打印 a 的输出并将其发布到这里吗?您可能只需要使用 srt() 函数。
  • print(str(z).strip('b'))?目前尚不清楚您为什么需要此输出。
  • 你的意思是a.hex()
  • 您确定浏览器不会将压缩数据编码为 base64 字符串吗? Base64 编码是二进制 blob 通常在网络世界中传递的方式。
  • @chepner:需要将其发送到浏览器。额外的 b' 导致内容长度不匹配。它是一个 zlib 压缩输出,返回字节。

标签: python gzip python-3.7 zlib


【解决方案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
>>>

【讨论】:

  • &gt;&gt;&gt; a = b'\x1f\x8b\x08\x00' &gt;&gt;&gt; b = str(a)[2:-1] '\\x1f\\x8b\\x08\\x00' 我期待一个 '\x1f\x8b\x08\x00'
  • 双反斜杠是 Python 的内部表示!您需要打印到标准输出或将变量写入文件以查看字符串。试试:print(b)
  • 你看到只是调用bprint(b) 之间的区别吗...
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-09-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-07-25
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多