gpt4 book ai didi

python - Pickle 转储和时间戳与预期不符

转载 作者:太空宇宙 更新时间:2023-11-03 20:26:47 24 4
gpt4 key购买 nike

我正在使用 pickle 操作 scapy 数据包对象,以便将它们共享给不同的进程。但是我目睹 pickle 更改了我的捕获文件的 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 对我来说很棒,因为在将数据发送到其他进程之前我不需要关心格式化数据。

感谢您的帮助。

  • 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.

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

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com