【问题标题】:How I should parse this type of bytes?我应该如何解析这种类型的字节?
【发布时间】:2020-07-28 08:22:00
【问题描述】:

我有以下类型的字节:

b = b'2787\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x05\x03\x01\x00\x00\x00\x00\x00\x96\x08\n\x00\x00\x00\x00\x00\x01\x00\x00\x00\x00\x0047\x00>2!\tMV\xa7\x00\x00\x00\x00'

我必须将其转换为字符串并获得 2787,我应该如何去除 \x00 值, 我刚刚尝试使用 decode("utf-8") 但抛出以下错误消息:

'utf-8' 编解码器无法解码位置 33 中的字节 0x96:无效起始字节

rstrip('\x00) 也不起作用。

我应该使用哪种类型的解码器?

我从这里得到一个字符串列表:

data, addr = socket_udp.recvfrom(struct.calcsize("B13s9s61s"))
info = struct.unpack("B13s9s61s", data)

而 b 是最后一个 61 字符串。 字符串内容:

class Udp_packet:
type = 0x00
id  = ""
random_num = ""
data = ""


def __init__(self, values_list, convert=False):       
    self.type       = values_list[0]
    self.id         = values_list[1]
    self.random_num = values_list[2]
    self.data       = values_list[3].split("\0")[0]

代码使用 python 2.7 可以正常工作,我刚移到 3.7.5

【问题讨论】:

  • 这个字符串是怎么生成的
  • @gold_cy 我收到它扔一个套接字。
  • 那个字符串应该是什么?在这 13 个起始字节中,哪些是相关的?你有一些格式规范吗?
  • @CristiFati 只是通讯中使用的附加数据,问题是最后一个字符串的经度并不总是61s。
  • 另一个选项是使用列表推导和迭代字节。不确定它是否可以帮助您剥离\x00。类似:''.join([b for b in bytes if b != b'\x00']) 可能会对您有所帮助。

标签: python string byte decode python-3.7


【解决方案1】:

你想要从b 得到的显然是第一个 NUL 字节之前的部分,b'\x00',或者只是b'\0',所以你可以通过第一个 NUL 字节的索引来分割b

b = b[:b.find(b'\0')]

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多