bytes对象是否支持元素赋值?修改pcap数据切片报错有什么解决办法
问题原因
Python 中的 bytes 属于不可变类型,设计上不支持直接对元素或切片进行赋值修改,因此你执行切片赋值操作时会触发类型错误。
可行实现方案
有两种常用的改写字节内容的方案,同时需要注意你现有代码中的长度匹配问题:你当前生成的new5只有8字节,而待替换的切片a[8:24]长度为16字节,直接替换会导致长度不匹配,需要先把时间戳补到16位(比如末尾补8个0,和原有TTF格式对齐)。
方案1:转为可变的bytearray操作
bytearray是Python内置的可变字节序列,支持直接切片赋值,修改完成后可以按需转回bytes类型:
x = rdpcap("ref.pcap") for packet in x: a = bs.hexlify(bytes(packet.load)) # 转为可变的bytearray a = bytearray(a) TTF = a[8:24] print ("T1",TTF) new0 = (TTF.decode('utf-8')) print ("T1-decode",new0) print ("T1-dec",int(new0, base=16)) new4 = hex(int(time.time()))[2:] # 补0到16位,匹配原有切片长度 new4 = new4.ljust(16, '0') print ("new4",new4) new5 = bytes(new4, encoding='utf8') print ("new5",new5) print (a[8:24]) # bytearray支持直接切片赋值 a[8:24] = new5 # 修改完成后转回bytes,再unhexlify得到原始二进制载荷,可赋值回packet.load modified_payload = bs.unhexlify(bytes(a)) packet.load = modified_payload
方案2:字节切片拼接
如果不想转换类型,可以直接把待保留的字节片段和新内容拼接成新的bytes对象:
# 把a[8:24] = new5替换为下面的拼接逻辑 a = a[:8] + new5 + a[24:]
这种方式本质是生成了一个全新的bytes对象,没有修改原对象,适合少量修改的场景。
内容的提问来源于stack exchange,提问作者Premkumar S
相关产品推荐
相关产品推荐

