按字节长度拆分Python中的数组
我有一个传感器系统。传感器接收我的指令,执行一些操作,然后把结果反馈给我。
反馈的内容是这样的:
seq. number | net_id | opcode_group | opcode | payloadlength | val
这些值之间用空格分隔。
现在我想获取最后一个值,叫做 val
。在这个部分,我得到了所有我想知道的信息,以便进一步处理传感器的反馈。
举个例子,我有一个命令的反馈,想知道传感器的IEEE MAC地址:
在这个例子中,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()
,具体可以参考这里。