解码字节序列时的思路是什么

2024-06-01 02:34:43 发布

您现在位置:Python中文网/ 问答频道 /正文

我有这个序列,我必须解码它,作为Python和编码的完全初学者

enc = b'\x80\x03}q\x00(K\x01K\x01K\x02K\x03K\x03K\x06K\x04G?\xc5UUUUUUK\x05G?\xe0\x00\x00\x00\x00\x00\x00K\x06G?\x9cq\xc7\x1cq\xc7\x1cK\x07G?\xc5UUUUUUK\x08K$K\tG?\xb5UUUUUUK\nK\x07K\x0bG?\xe5UUUUUUK\x0cG?\xb5UUUUUUK\rG?\xedUUUUUUK\x0eK4K\x0fG?\xb3\xb1;\x13\xb1;\x14K\x10K\x00K\x11G?\xcd\x89\xd8\x9d\x89\xd8\x9eK\x12G?\xcb\x9b\x9b\x9b\x9b\x9b\x9cK\x13G?\xa4\x14\x14\x14\x14\x14\x14K\x14X\x08\x00\x00\x00discretaq\x01K\x15K\x02K\x16X\x02\x00\x00\x00daq\x02K\x17G?\xe4z\xe1G\xae\x14{K\x18G@\x15\x00\x00\x00\x00\x00\x00K\x19G?\xe4z\xe1G\xae\x14|K\x1aK2K\x1bK\x01K\x1cK\x03K\x1dG?\xd5UUUUUUK\x1eG?\xc5UUUUUUK\x1fK\x01K K\x04K!G?\xaf\xf2\xe4\x8e\x8aq\xdeK"K\x04K#X\x04\x00\x00\x00mareq\x03u.'

我试着这样做

strputere = enc.decode()

print(strputere)

我得到一个错误

File "encode.py", line 4, in <module>
    strputere = enc.decode()
UnicodeDecodeError: 'utf-8' codec can't decode byte 0x80 in position 0: invalid start byte

我开始做一些研究,发现b代表字节

所以我的enc变量是字节字符串文字。我研究过.decode(),它似乎是一个不错的选择,但可能不是

我有点困惑,因为它是一个字节字符串文字,但它包含一些我认为是UTF-8字符的字符(如\x80)

那么,我如何解码这个,它的算法是什么?我很想知道发生了什么,我做了研究,但我有点迷路了,我需要一些帮助


Tags: 字节解码decodeencx00x80x14x9b
3条回答

因此,通常,当您有一个字节序列时,您有两种不同的方法来处理它,具体取决于内容:

  1. 它是纯字符串序列吗?

如果处理纯字符串序列,则需要使用以下方法进行解码:

enc.decode("utf-8") 

请记住,在这种情况下,您必须知道使用了什么编码(这里是utf-8)。但根据您收到的错误消息,它可能不正确。

如果您不知道编码,但您知道它肯定是字符串编码,那么您可以看看这个问题中提到的选项here

  1. 传感器/其他输入

如果您使用的是嵌入式设备或任何可能包含一系列数据的字节输入,而不仅仅是一个字段,则必须使用struct.unpack()。这有点复杂,您需要通过docs查找解码时必须使用的确切字符串

它的工作方式是告诉python每个字节是什么(字符串、int等)以及每个字节的长度,然后它会将其转换为一个对象元组,如下所示:

values = list(struct.unpack('>BBHBBhBHhHL', enc))

这些数据是使用python pickle模块编码的。您可以对其进行解码,以便:

>>> import pickle
>>> numbers = pickle.loads(enc)
>>> print(numbers)
{1: 1, 2: 3, 3: 6, 4: 0.16666666666666666, 5: 0.5, 6: 0.027777777777777776, 7: 0.16666666666666666, 8: 36, 9: 0.08333333333333333, 10: 7, 11: 0.6666666666666666, 12: 0.08333333333333333, 13: 0.9166666666666666, 14: 52, 15: 0.07692307692307693, ...

发生错误的原因是字符串包含不可使用utf-8进行解码的非ASCII字符

它只是随机数据还是使用某种特定的编码? 使用“unicode_escape”进行解码确实有效,但输出似乎没有那么有用

enc.decode("unicode_escape")

返回:

'\x80\x03}q\x00(K\x01K\x01K\x02K\x03K\x03K\x06K\x04G?ÅUUUUUUK\x05G?à\x00\x00\x00\x00\x00\x00K\x06G?\x9cqÇ\x1cqÇ\x1cK\x07G?ÅUUUUUUK\x08K$K\tG?µUUUUUUK\nK\x07K\x0bG?åUUUUUUK\x0cG?µUUUUUUK\rG?íUUUUUUK\x0eK4K\x0fG?³±;\x13±;\x14K\x10K\x00K\x11G?Í\x89Ø\x9d\x89Ø\x9eK\x12G?Ë\x9b\x9b\x9b\x9b\x9b\x9cK\x13G?¤\x14\x14\x14\x14\x14\x14K\x14X\x08\x00\x00\x00discretaq\x01K\x15K\x02K\x16X\x02\x00\x00\x00daq\x02K\x17G?äzáG®\x14{K\x18G@\x15\x00\x00\x00\x00\x00\x00K\x19G?äzáG®\x14|K\x1aK2K\x1bK\x01K\x1cK\x03K\x1dG?ÕUUUUUUK\x1eG?ÅUUUUUUK\x1fK\x01K K\x04K!G?¯òä\x8e\x8aqÞK"K\x04K#X\x04\x00\x00\x00mareq\x03u.'

相关问题 更多 >