Python - может кто-нибудь сказать мне, что делают эти две строки? - PullRequest
0 голосов
/ 24 октября 2011

Я пытаюсь преобразовать этот код Python в C. Но для жизни я не могу понять, что делает эта строка здесь. Остальная часть программы кажется простой.

self.payload = "\x02\x00%s%s" % (
    pack(">b", length),
    "".join(random.choice(string.printable) for i in range(length)))

Если бы кто-нибудь мог дать мне приблизительное представление о том, что он делает, это было бы очень ценно!

1 Ответ

5 голосов
/ 24 октября 2011

Первая строка:

  • Правильный перевод length = random.randint(18, 20): int length = rand() % 3 + 18.

Теперь давайте разберем плотную вторую строку по частям.

  • "\x02\x00%s%s" % (x, y) означает замену строки формата данными аргументами (например, sprintf()).В этом случае это означает объединение байтов 0x02, 0x00 с двумя последующими строками x и y.

  • x = pack(">b", length) использует struct.pack().В этом случае это означает преобразование целочисленного значения length в один байт, представляющий его значение.Это почти эквивалентно использованию chr().

  • y = "".join(z) означает взять каждый элемент в списке z (который должен быть строкой) и объединитьих с "" (ничего) между ними.(Например, "@".join(["a","b","c"]) --> "a@b@c".)

  • z = (random.choice(string.printable) for i in range(length)) возвращает объект генератора.Вы можете думать о нем как о списке, элементы которого вычисляются по требованию.В этом случае он генерирует length элементов, где каждый элемент представляет собой один символ, случайно выбранный из строки string.printable.

В общем, вторая строкавозвращает строку, начинающуюся с xx 0x02 0x00, за которой следует (char)length, за которыми следуют length случайные символы, каждый из которых равномерно выбран из набора символов string.printable.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...