سؤال

لدي مشكلة مزعجة حقا حاولت حلها لبضعة أيام.لا يمكنني العثور على أي معلومات على الشبكة.

حاولت حلها بنفسي ، تشاورت مع الوثائق.لكن لا شيء يعمل.

مشكلتي هي

عندما أقوم بتعيين متغير X مع RandMAC() وظيفة, X يجب أن تكون هي نفسها في كل مرة أستخدمها.

مثل, X = RandMAC(), ، ودعونا نقول X هو الآن AA:BB:CC:DD:EE:FF وعندما أطبع س لمدة 3 مرات ، يجب أن يكون شيئا من هذا القبيل.

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  

لذلك تغيرت في كل مرة أدعو طباعة العاشر.

كيف يمكنني حل هذه المشكلة ?

رمز بلدي هو على النحو التالي.

from scapy.all import *

X = RandMAC()

print X
print X
print X

شكرا لكم جميعا مقدما.

هل كانت مفيدة؟

المحلول

RandMAC هو فئة ، وعند استدعاء RandMAC() ما تحصل عليه هو مثال على تلك الفئة. scapy لديها الكثير من هذه RandXXXXX الطبقات ، وأنهم جميعا يتصرفون بنفس الطريقة:مثيل الطبقة هو في الحقيقة نوع من عشوائي شيء مولد ، وليس ثابت (ولكن تم اختيارها عشوائيا) شيء.في هذه الحالة ، أ RandMac بنيت من ستة RandByteس ، و أ RandByte يتحول إلى قيمة عشوائية من 0 إلى 255 في كل مرة يطلب فيها قيمتها.

والفكرة ، على ما أعتقد ، هي أن تجعل من السهل بناء (على سبيل المثال) موزع عشوائي لحزمة إب يمنحك حزم إب التي هي كل نفس إلا أنه يتم اختيار اثنين من الحقول عشوائيا لكل حزمة.

لذلك ، على أي حال ، يتم تفويض العديد من العمليات على كائنات الأشياء العشوائية بشكل فعال لنتائج "إصلاحها" (أي اختيار قيمة عشوائية معينة);انظر volatile.py في شفرة المصدر ، فئة VolatileValue;السحر يحدث في __getattr__ الطريقة.على وجه الخصوص ، ينطبق هذا على التوتير عبر __str__, ، وهو ما str() هل كما لوحظ من قبل ليشا وماذا print هل كما لاحظ كارون س.

إذا كنت ترغب في الحصول على قيمة عشوائية واحدة ، وأقرب شيء إلى الطريق الصحيح هو على الارجح لاستدعاء _fix الطريقة: X = RandMAC()._fix().أن يحدث أن تكون هي نفسها str ل RandMAC, ، ولكن على سبيل المثال.إذا كان لديك عدد صحيح عشوائي ثم _fix سوف تعطيك عدد صحيح الفعلي في حين str سوف تعطيك تمثيل سلسلة لها.

لا يبدو أن أيا من هذا موثق.لا تجعل أي رهانات كبيرة على أنها لا تزال تعمل في الإصدارات المستقبلية.(ولكن ، لما يستحق, volatile.py لم يتغير منذ حوالي عامين.)

نصائح أخرى

أنا لا أعرف إذا RandMac لديه طريقة للقيام بهذه الطريقة الأخرى ، ولكن يمكنك تحويل X في سلسلة ، بهذه الطريقة ستبقى كما هي.في التعليمات البرمجية الخاصة بك X في الواقع يدعو وظيفة في كل مرة.

X = str(RandMAC())
print X
print X
print X
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top