#python #string #hex #checksum #crc32
#python #строка #шестнадцатеричный #контрольная сумма #crc32
Вопрос:
Я хочу вычислить контрольную сумму CRC32 для строки шестнадцатеричных значений в python. Я нашел zlib.crc32(данные) и binascii.crc32(данные), но все примеры, которые я нашел с использованием этих функций, содержат ‘data’ в виде строки (например, ‘hello’). Я хочу передать шестнадцатеричные значения в качестве данных и найти контрольную сумму. Я попытался задать данные в виде шестнадцатеричного значения (например, 0x18329a7e), и я получаю ошибку типа: должно быть string или buffer, а не int. Функция вычисляет, когда я превращаю шестнадцатеричное значение в строку (например, ‘0x18329a7e’), но я не думаю, что она вычисляет правильную контрольную сумму. Буду признателен за любую помощь. Спасибо!
Комментарии:
1. Что именно вы подразумеваете под «передачей шестнадцатеричных значений»? Вы понимаете, что шестнадцатеричное — это просто числовое представление для людей, и что CRC32 применяется к двоичным данным? Неясно, что именно вы хотите сделать: вычислить CRC32 строки, содержащей шестнадцатеричные символы, или некоторых двоичных данных, которые где-то в вашем программном обеспечении представлены в виде шестнадцатеричных значений.
2. Я хочу вычислить CRC32 некоторых двоичных данных, которые где-то в моем программном обеспечении представлены в виде шестнадцатеричных значений.
3. Тогда ответ Эндрю делает это.
Ответ №1:
Я думаю, вы ищете binascii.a2b_hex()
:
>>> binascii.crc32(binascii.a2b_hex('18329a7e'))
-1357533383
Комментарии:
1. Спасибо! Это именно то, что мне было нужно. Результаты совпадают с онлайн-калькулятором crc ( lammertbies.nl/comm/info/crc-calculation.html ). Я не указывал в первоначальном вопросе, но я также ищу, чтобы на выходе была строка из 8 шестнадцатеричных значений. Следующий код правильно форматирует выходные данные, если кому-то интересно: ‘X’ % (binascii.crc32(binascii.a2b_hex(‘18329a7e’)) amp; 0xffffffff) Еще раз спасибо за помощь!
Ответ №2:
>>> import struct,binascii
>>> ncrc = lambda numVal: binascii.crc32(struct.pack('!I', numVal))
>>> ncrc(0x18329a7e)
-1357533383
Ответ №3:
Попробуйте преобразовать список шестнадцатеричных значений в строку:
t = ['x18', 'x32', 'x9a', 'x7e']
chksum = binascii.crc32(str(t))
Комментарии:
1. Я сомневаюсь, что он хочет преобразовать список в строку, подобную этой. Замена вашей второй строки на binascii.crc32(«.join(t)) дает тот же результат, что и ответ пхихага.