Не могли бы помочь с описание программы? Простенькая

211 просмотра
0
0 Комментариев

Простенький клиент чата с ICMP и сервером. Можете дать описание каждой строчке кода? Гуглю отдельную часть кода, но вкупе может выйти не то, что имеется

def getChecksum(source_string):
    sum = 0
    countTo = (len(source_string)/2)*2
    count = 0
    while count < countTo:
        thisVal = ord(source_string[count + 1])*256 + ord(source_string[count])
        sum = sum + thisVal
        sum = sum & 0xffffffff
        count = count + 2
    if countTo<len(source_string):
        sum = sum + ord(source_string[len(source_string) - 1])
        sum = sum & 0xffffffff
    sum = (sum >> 16)  +  (sum & 0xffff)
    sum = sum + (sum >> 16)
    answer = ~sum
    answer = answer & 0xffff
    # Swap bytes.
    answer = answer >> 8 | (answer << 8 & 0xff00)
    return answer


Добавить комментарий

1 Ответы

Python Опубликовано 18.12.2018
0

Я не знаю питон, но попробую:

def getChecksum(source_string):
    # изначально сумма равна 0
    sum = 0
    # СountTo = длине source_string, с округлением до 2
    countTo = (len(source_string)/2)*2
    # начиная с 0-го (первого) символа строки
    count = 0
    # пока count < countTo выполняем цикл
    while count < countTo:
        # thisVal = машинному слову (word) из ASCII кодов символов с индексами [count] и [count + 1]
        # ord(x) * 256 эквивалентно ord(x) shl 8 или ord(x) << 8 в других языках
        thisVal = ord(source_string[count + 1])*256 + ord(source_string[count])
        # суммируем текущее значение sum и получившееся слово
        sum = sum + thisVal
        # оставляем от sum только младшие 32 бита (4 байта, dword, int etc.)
        sum = sum & 0xffffffff
        # увеличиваем счётчик обработанных символов на 2
        count = count + 2
    # после цикла, если у нас остался (один) необработанный символ в строке, то
    if countTo<len(source_string):
        # прибавляем к сумме его ASCII код
        sum = sum + ord(source_string[len(source_string) - 1])
        # снова оставляем только младшие 32 бита
        sum = sum & 0xffffffff
    # складываем между собой старшее и младшее слова полученного значения summ
    sum = (sum >> 16)  +  (sum & 0xffff)
    # прибавляем к полученной выше сумме старшее слово этой же суммы
    sum = sum + (sum >> 16)
    # инверсия бит sum и присвоение значения answer (т.е. 11011011 -> 00100100)
    answer = ~sum
    # оставляем только младшие 16 бит (два байта, одно слово, word) получившегося значения
    answer = answer & 0xffff
    # Swap bytes. -> меняем местами старший и младший байты результата
    answer = answer >> 8 | (answer << 8 & 0xff00)
    # возвращаем результат
    return answer

Добавить комментарий
Напишите свой ответ на данный вопрос.
Scroll Up