按字节长度拆分Python中的数组

2 投票
2 回答
1236 浏览
提问于 2025-04-17 13:57

我有一个传感器系统。传感器接收我的指令,执行一些操作,然后把结果反馈给我。

反馈的内容是这样的:

seq. number |   net_id  |   opcode_group |  opcode | payloadlength    |   val

这些值之间用空格分隔。

现在我想获取最后一个值,叫做 val。在这个部分,我得到了所有我想知道的信息,以便进一步处理传感器的反馈。

举个例子,我有一个命令的反馈,想知道传感器的IEEE MAC地址:

response

在这个例子中,val 是反馈中所有在 Length 之后的字段。虽然没有明确的分隔符,但我得到的是一串字符串。

我需要做的就是把这串数字分开,只需要知道每个字段的长度。例如,状态占1个字节,MAC地址占8个字节,等等……

我的代码是这样的:

if response.error:
        ret['error'] = 'Error while retrieving unregistered sensors'
    else:
        for line in response.body.split("\n"):
            if line != "": 
                value = int(line.split(" ")[6])

    ret['response'] = value
    self.write(tornado.escape.json_encode(ret))
    self.finish()               

    if command == 'IDENTIFY':
        status = value.split(" ")[0]
        IEEEAddrRemoteDev = value.split(" ")[1]
        NWKAddrRemoteDev = value.split(" ")[2]
        NumOfAssociatedDevice = value.split(" ")[3]
        StartIndex = value.split(" ")[4]
        ListOfShortAddress = value.split(" ")[5]
        if status == 0x00:
            ret['success'] = "The %s command has been succesfully sent! \
            IEEE address: %s" % % (command.upper(), IEEEAddrRemoteDev)
            self.write(tornado.escape.json_encode(ret))
        elif status == 0x80:
            ret['success'] = "Invalid Request Type"
            self.write(tornado.escape.json_encode(ret))
        elif status == 0x81:
            ret['success'] = "Device Not Found"
            self.write(tornado.escape.json_encode(ret))

在代码的第一部分,我从整个反馈中取出第六个值,并把它放入变量 value 中。接下来,我想把这个变量分成每个组成部分。

比如说,这个 status = value.split(" ")[0],我该怎么分割呢???

非常感谢你的帮助!

2 个回答

0

问题在于,你把这个当成了一个Python字符串,但其实它只是一些二进制数据。

你需要使用 struct.unpack 来把这些数据拆分开。

0

val字段的具体格式是什么?也就是你代码中value的内容是什么?是字符串吗?还是一串字节?

如果是字符串,你可以使用:

   status = value[0]
   IEEEAddrRemoteDev = value[1:8]
   NWKAddrRemoteDev = value[9:2]
   NumOfAssociatedDevice = value[11:1]
   StartIndex = value[12:1]
   ListOfShortAddress = value[13:2*NumOfAssociatedDevice]

如果是一串字节,那你可以使用struct.unpack(),具体可以参考这里

撰写回答