我正在用咸菜处理漏斗包对象,以便将它们共享给不同的进程。
但是,我看到泡菜改变了我的捕获文件的pkt.time属性:


为了重现此行为,您只需要一个小的pcap即可:


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:
进一步挖掘后,我发现如果仅对时间属性进行腌制,则它可以按预期工作,我不知道该如何更改任何内容。

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

最佳答案

我找到了解决此问题的方法,因为仅腌制pkt.time才有效,所以我只腌制pkt并在其旁边添加pkt.time:

dmp = pickle.dumps((pkt,pkt.time))
ld = pickle.loads(dmp)
print(ld[1]) #Works as expected.

关于python - pickle 转储和时间戳与预期不符,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/57759570/

10-12 22:22