Рассчитать контрольную сумму, используя xor в python 3 - PullRequest
0 голосов
/ 13 марта 2020

Итак, я собираю некоторые коды с устройства ip и пытаюсь набрать c это контрольная сумма. Например, это пакет, который я собрал, используя простой сокет в python:

b'\x07\x94ES(\xff\xceY:'

Преобразование его в более удобочитаемый, используя .hex(), я получил это:

0794455328ffce593a

3a - это заданная контрольная сумма, я должен быть в состоянии получить то же значение с помощью кода (например, 07^94^45^53^28^ff^ce^59^FF = 3a), но я не могу понять, как. Я пытался переписать значения как целые числа, но результат был далеко. Кстати, 07 - это количество байтов пакета.

Другой пример строки:

b'\x11\xb0\x11\x05\x03\x02\x08\x01\x08\x01\x03\x08\x03\n\x01\n\n\x01I'

У кого-нибудь есть идеи?

Ответы [ 2 ]

2 голосов
/ 13 марта 2020

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

data_list = [b'\x07\x94ES(\xff\xceY:', b'\x11\xb0\x11\x05\x03\x02\x08\x01\x08\x01\x03\x08\x03\n\x01\n\n\x01I']
for data in data_list:
    value = data[0]
    for d in data[1:-1]:
        value ^= d

    checksum = value ^ 0xFF  # negate all the bits

    if checksum == data[-1]:
        print("checksum match for {}".format(data))
    else:
        print("checksum DOES NOT MATCH for {}".format(data))

печатает:

checksum match for b'\x07\x94ES(\xff\xceY:'
checksum match for b'\x11\xb0\x11\x05\x03\x02\x08\x01\x08\x01\x03\x08\x03\n\x01\n\n\x01I'

, но не уверен, поможет ли это будущим читателям, но, по крайней мере, это решено.

0 голосов
/ 13 марта 2020

Если вам интересно, вот прямой порт реализации C#, который вы указали в комментарии:

def calculate(data):
    xor = 0
    for byte in data:
        xor ^= byte

    xor ^= 0xff
    return xor

Я не осознавал, что последний байт на самом деле был контрольной суммой.

...