我有一个非常恼人的问题,我试图解决几天。 我在网上找不到任何信息。
我试图自己解决,咨询文件。 但没有任何作用。
我的问题是
当我使用X
函数分配变量RandMAC()
时,X
每次使用时都应该相同。
赞,X = RandMAC()
,让我们说X
现在是AA:BB:CC:DD:EE:FF
当我打印X三次时,它应该是这样的。
X = AA:BB:CC:DD:EE:FF
X = AA:BB:CC:DD:EE:FF
X = AA:BB:CC:DD:EE:FF
但代码实际上做的是
X = AA:BB:CC:DD:EE:FF
X = 00:0A:0B:0C:0D:0E:0F
X = 11:22:33:44:55:66
所以每当我打印X时它都会改变。
我该如何解决这个问题?
我的代码如下。
from scapy.all import *
X = RandMAC()
print X
print X
print X
提前谢谢大家。
答案 0 :(得分:3)
RandMAC
是一个类,当你调用RandMAC()
时,你得到的是该类的一个实例。 scapy
有很多这些RandXXXXX
类,它们都以相同的方式运行:类的实例实际上是一种随机事物生成器,而不是固定的(但随机选择) )事情。在这种情况下,RandMac
由六个RandByte
构建,RandByte
每次要求其值变为0到255之间的随机值。
我认为,这个想法是为了轻松构建(例如)一个IP数据包随机数发生器,它为您提供完全相同的IP数据包,除了为每个数据包随机选择几个字段。
因此,无论如何,对随机事物对象的许多操作被有效地委托给“修复”它们的结果(即,选择特定的随机值);请参阅源代码中的volatile.py
,类VolatileValue
;魔术发生在__getattr__
方法中。特别是,这适用于通过__str__
进行字符串化,这是Lycha观察到的str()
以及Karun S观察到的print
所做的事情。
如果你想获得一个随机值,最接近正确方法的东西可能是调用_fix
方法:X = RandMAC()._fix()
。这恰好与str
的{{1}}相同,但例如如果你有一个随机整数,那么RandMAC
会给你一个实际的整数,而_fix
会给你一个字符串表示。
这些似乎都没有记录在案。不要对它进行任何大赌注仍然可以在将来的版本中使用。 (但是,对于它的价值,str
大约两年没有改变。)
答案 1 :(得分:1)
我不知道RandMac
是否有办法以其他方式执行此操作,但您可以将X
转换为字符串,这样它将保持不变。在您的代码X
中,每次实际调用一个函数。
X = str(RandMAC())
print X
print X
print X