我正在使用 pickle 操作 scapy 数据包对象,以便将它们共享给不同的进程。但是我目睹 pickle 更改了我的捕获文件的 pkt.time 属性:
import pickle
from scapy.all import * # v2.4.3
def ppacket(pkt):
print(pkt.time)
print(pickle.loads(pickle.dumps(pkt)).time)
sniff(offline="test.pcap", prn=ppacket, count=10) #You only need one packet
现在在本月早些时候创建的 pcap 上运行它,我得到的结果是:
1562587696.325424 #7/8/2019, 2:08:16 PM
1567437619.227692 #9/2/2019, 5:20:19 PM
据我了解,问题来自于这个属性实际上是定义为函数调用的事实:
#In scapy: packet.py
def __init__(self, _pkt=b"", post_transform=None, _internal=0, _underlayer=None, **fields): # noqa: E501
self.time = time.time()
如何避免这种行为? pickle 对我来说很棒,因为在将数据发送到其他进程之前我不需要关心格式化数据。
感谢您的帮助。
$ pip freeze |grep pickle
jsonpickle==1.1
pickleshare==0.7.4
编辑1:经过进一步挖掘,我发现如果我只 pickle 时间属性,它会按预期工作,我不明白它应该如何改变任何东西。
print(pkt.time)
# > 1562587696.325424 #7/8/2019, 2:08:16 PM
print(pickle.loads(pickle.dumps(pkt.time)))
# > 1562587696.325424 #7/8/2019, 2:08:16 PM
我找到了解决这个问题的方法,因为只 pickle pkt.time 有效,所以我只需 pickle pkt 并在其旁边添加 pkt.time :
dmp = pickle.dumps((pkt,pkt.time))
ld = pickle.loads(dmp)
print(ld[1]) #Works as expected.
我是一名优秀的程序员,十分优秀!