Уведомления

Группа в Telegram: @pythonsu

#1 Апрель 20, 2017 18:18:56

Kir
Зарегистрирован: 2017-04-20
Сообщения: 1
Репутация: +  0  -
Профиль   Отправить e-mail  

Как правильно посчитать CRC32?

Здравствуйте, уважаемые.

С питоном я знаком пару недель и вот, столкнулся с проблемой подсчета CRC32. Суть такая: я создаю соккет, подключаюсь к определенному порту сервера, который отдает мне пакеты с данными. Мне в этом потоке нужно выловить пакет, начинающийся определенной последовательностью байт, отсчитать 20 байт, “откусить” от них 4 байта контрольной суммы, посчитать CRC32 оставшихся 16 байт и сравнить с “откушенными” четырьмя. Ну и дальше уже потрошить этот пакет, если CRC совпала. И вроде бы все хорошо шло, но тут появилась засада в виде “оно считает, но какую-то фигню выдает”:

 buff = sock.recv(1024)
buff = (binascii.hexlify(bytearray(buff)))
x = int(buff.find(b'd1'))
packet = buff[x:x+40:]
packet_without_crc = packet[0:32:]
print(packet)
print(packet_without_crc)
print(CRC32().calculate(packet_without_crc))
print(zlib.crc32(packet_without_crc))
print(hex(CRC32().calculate(packet_without_crc)))
print(hex(zlib.crc32(packet_without_crc))
)

Результат выполнения этого кусочка:

b'd100000000000000800109000000e3eea24fd536' (пакет полностью)
b'd100000000000000800109000000e3ee' (пакет без последних четырех байт)
1077117066 (CRC32, посчитанная при помощи модуля PyCRC)
1077117066 (CRC32, посчитанная при помощи модуля zlib)
0x4033808a (оно же в hex)
0x4033808a (оно же в hex)

Два модуля выдают идентичный результат, из чего можно сделать вывод, что считает правильно, но результат совсем не похож на a24fd536 . Вот здесь разбирают похожий вопрос http://stackoverflow.com/questions/30092226/how-to-calculate-crc32-with-python-to-match-online-results и дается обяснение, что все дело в signed и unsigned CRC32 но у меня снова “не заплясало”. Причем, онлайн калькуляторы типа этого http://www.tahapaksu.com/crc/ Выдают верное значение. Значит, я где-то ошибаюсь в своих рассуждениях… Очень прошу помощи.

Офлайн

#2 Апрель 21, 2017 10:37:13

PooH
От:
Зарегистрирован: 2006-12-05
Сообщения: 1948
Репутация: +  72  -
Профиль   Отправить e-mail  

Как правильно посчитать CRC32?

У вас данные в строке в ASCII виде.

  
In [54]: import binascii
In [55]: s = b'd100000000000000800109000000e3ee'
In [56]: hex(binascii.crc32(binascii.a2b_hex(s)))
Out[56]: '0x36d54fa2'



Вот здесь один из первых отарков съел лаборанта. Это был такой умный отарк, что понимал даже теорию относительности. Он разговаривал с лаборантом, а потом бросился на него и загрыз…

Отредактировано PooH (Апрель 21, 2017 10:40:01)

Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version