Scapy set вопрос атрибута класса - PullRequest
1 голос
/ 19 июля 2011

Я работаю со scapy и у меня есть вопрос, связанный со scapy, но также и с python.Я пытаюсь использовать переменные как scapy имена полей.Вот фрагмент кода, который должен проиллюстрировать, что я пытаюсь сделать (это не работает):

class Test(Packet):
    name = "Test23"
    def __init__(self,foo=None):
        self.foo=foo

    fields_desc = [
                BitField(self.foo, 0x0, 4),
                BitField("bar", 0x3, 4)
                ]

Теперь я представляю, что проблема в том, что fields_desc является атрибутом класса, а не классапеременная.Теперь, как я могу достичь того, что я хочу?(установка имени self.foo во время инициализации / инициализации класса?)

Буду благодарен за любую помощь.С наилучшими пожеланиями

Редактировать: добавления счетчика будет достаточно.Я пытался:

class Counter:
     count = 0    
     def __init__(self):
         self.__class__.count += 1 
     foo = [ 
            "lala"+str(count)
            ]   
     print foo 


a=Counter()
a.count
print a.foo
b=Counter()
b.count
print b.foo

Но, похоже, не работает.Было бы здорово, если бы вы указали мне правильное направление, так или иначе я потерялся.

Ответы [ 2 ]

1 голос
/ 16 января 2015

Я предполагаю что вы пытаетесь сделать, это изменить имя первого BitField на основе ввода необработанных данных, который вы анализируете, с помощью getfield?Трудно сказать ...

В любом случае, из функции pre_dissect вы можете просматривать необработанные данные и добавлять поля к self.fields_desc, как вам угодно.При использовании pre_dissect обязательно возвращайте необработанные пакетные данные в конце функции без изменений.

По моему опыту, это очень редко правильный путь, обычно ConditionalField и перегрузка классов работают многолучше в долгосрочной перспективе.

Удачи

1 голос
/ 19 июля 2011

I думаю, атрибуты класса инициализируются до запуска конструктора класса, поэтому self.foo не был назначен при создании fields_desc.Попробуйте объявить fields_desc как пустой массив и добавить к нему объекты BitField внутри вашей функции __init__.

Я не знаю, как работает класс Packet, от которого вы наследуете, но вы также можете захотеть посмотретьв функции super () .

Редактировать: Может быть, вы ищете что-то подобное?

class Counter:
    i = 0
    foo = []
    def count(self):
        self.__class__.i += 1
        self.__class__.foo.append(['lala' + str(self.__class__.i)])

a = Counter()
a.count()
print Counter().foo
b = Counter()
b.count()
print Counter().foo

Вывод

[['lala1']]
[['lala1'], ['lala2']]

Подробнее о переменных класса здесь

...