You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.19 02:06:08