С питоном я знаком пару недель и вот, столкнулся с проблемой подсчета 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/ Выдают верное значение. Значит, я где-то ошибаюсь в своих рассуждениях… Очень прошу помощи.