Python struct.pack: обязательный аргумент не является целым числом.Входные данные являются целыми числами - PullRequest
0 голосов
/ 12 марта 2019

Я использую модифицированную версию https://github.com/houluy/UDP для анализа и отправки необработанных пакетов UDP.Однако иногда это случайным образом вызывает исключение в struct.pack ().Кажется, он не связан с определенным пакетом, но когда я увеличиваю скорость передачи пакетов, появляется ошибка.

Соответствующий код:

src_port = src_addr[1]
dest_port = dest_addr[1]

udp_length = 8 + len(data)

checksum = 0
pseudo_header = struct.pack('!BBH', zero, protocol, udp_length)
pseudo_header = src_ip + dest_ip + pseudo_header
try:
    udp_header = struct.pack('!4H', src_port, dest_port, udp_length, checksum)
except struct.error as err:
    print(err)
    print("Port: " + str(src_port) + " = " + str(type(src_port)))
    print("DestPort: " + str(dest_port) + " = " + str(type(src_port)))
    print("Len: " + str(udp_length) + " = " + str(type(src_port)))
    print("Checksum: " + str(checksum) + " = " + str(type(src_port)))

struct.pack выдает ошибкуОбязательный аргумент не является целым числом.Таким образом, я печатаю типы в предложении "исключение", чтобы проверить, что происходит не так.Я получаю следующий вывод:

required argument is not an integer
Port: 123 = <class 'int'>
DestPort: 123 = <class 'int'>
Len: 16 = <class 'int'>
Checksum: 0 = <class 'int'>

Я не имею ни малейшего понятия, что здесь происходит не так.Если бы я должен был явным образом привести значение к целым числам, чтобы быть уверенным в следующей строке, то произошло бы то же самоеВот.Запуск Python 3.6.7 в CentOS Linux версии 7.5.1804.

1 Ответ

0 голосов
/ 12 марта 2019

Я нашел ответ.Оказалось, что dest_port был строкой в ​​конце концов.Почему Python все еще печатал, что это был тип int, для меня до сих пор загадка.После явного преобразования в int () проблема осталась.Изменение данных в источнике на int () решило проблему.Это все еще странное поведение, я бы сказал.

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