2015-09-03 4 views
0

я упаковал-структуру, используя эту линиюPython структура распаковка для контрольной суммы

# type(8) code(8) checksum(16) process id(16) sequence(16) 
packet = struct.pack("bbHHh", ICMP_ECHO_REQUEST, 0, packet_checksum, pid, sequence) 

И теперь им с помощью функции вычисления контрольной суммы, которая распаковывает пакет таким образом, что 16 бит, где контрольная сумма должна быть (packet_checksum) удален. Но я не знаю, как это происходит, и что делает функция sum на самом деле? добавить различные элементы ?:

n = len(pkt) 
two_bytes = struct.unpack("%sH" % (n/2), pkt) 
chksum = sum(two_bytes) 

код работает хорошо, мне просто интересно, как это работает.

+0

Вы прочитали [соответствующий] (https://docs.python.org/3/library/struct.html?module-struct#struct.unpack) [документация] (https://docs.python.org /3/library/functions.html?sum#sum)? –

+0

Я озадачен использованием 'n = len (pkt); ... "% sH"% (n/2) ', потому что, ну, H равно 2 байтам, поэтому длина в байтах берется, а затем делится на 2, а затем умножается на длину H, что равно 2. . 'n = (n/2) * 2 Итак, эта часть кажется бессмысленной. – zxq9

ответ

0

Вы, кажется, пытаетесь создать ICMP-пакет и затем вычислить контрольную сумму для него. Для этого вы должны выполнить свой начальный pack с 0 для контрольной суммы, а не пытаться ее удалить. Затем можно извлечь каждое слово следующим образом:

for x in xrange(0, len(packet), 2): 
    print struct.unpack("H", packet[x:x+2])[0] 

Это предполагает, что ваша пакет четного числа байт, поэтому, если длина нечетная, то, возможно, временно добавить дополнительный 0 для расчета.

Примечание. Контрольная сумма ICMP не является простым случаем их объединения, она требует суммы одного комплимента. Дополнительную информацию см. В следующем answer.

 Смежные вопросы

  • Нет связанных вопросов^_^