我编写了一段代码,以这种格式解压缩结构:
----------------------------------------------------------
| 1 unsigned char | 7 char | 13 char | 7 char | 50 char |
----------------------------------------------------------
因此,当我执行此代码时:
datagram = unpack('1B7s13s7s50s',raw_datagram[0])
print len(datagram)
datagram = [data.replace('\x00','') for data in list(datagram) if isinstance(data, str)]
print len(datagram)
输出为:
5
4
raw_datagram[0]
是:
(0,'SW-01 \ x00 \ x00','89F107457A36 \ x00','000000 \ x00','\ x00 \ x00 \ x00 \ x00 \ x00 \ x00 \ x00 \ x00 \ x00 \ x00 \ x00 \ x00 \ x00 \ x00 \ x00 \ x00 \ x00 \ x00 \ x00 \ x00 \ x00 \ x00 \ x00 \ x00 \ x00 \ x00 \ x00 \ x00 \ x00 \ x00 \ x00 \ x00 \ x00 \ x00 \ x00 \ x00 \ x00 \ x00 \ x00 \ x00 \ x00 \ x00 \ x00 \ x00 \ x00 \ x00 \ x00 \ x00 \ x00 \ x00 \ x00 \ x00 \ x00 \ x00')
为什么删除第一个整数?
答案 0 :(得分:1)
您只对字符串过滤了输出列表,因为列表理解中包括了if ...
测试:
[data.replace('\x00','') for data in list(datagram) if isinstance(data, str)]
# all entries in datagram, that are strings
这等效于:
new_datagram = []
for data in list(datagram):
if isinstance(data, str):
new_value = data.replace('\x00','')
new_datagram.append(new_value)
datagram = new_datagram
您要改用条件表达式:
new_datagram = []
for data in datagram:
new_value = data.replace('\x00','') if isinstance(data, str) else data
new_datagram.append(new_value)
datagram = new_datagram
或者,作为列表理解:
datagram = [data.replace('\x00','') if isinstance(data, str) else data for data in datagram]
我在这里使用str.rstrip('\x00')
,因为空字节可能仅用作长度填充:
datagram = [data.rstrip('\x00') if isinstance(data, str) else data for data in datagram]
并且因为您已经知道格式,所以只需要将此格式应用于字符串的4个元素:
datagram = [datagram[0]] + [data.rstrip('\x00') for data in datagram[1:]]