Как правильно использовать binascii.crc32 в байтовом массиве - PullRequest
0 голосов
/ 21 мая 2019

У меня есть то, что должно быть массивом Hex, но всегда рассматривается как 'str' в binascii.crc32 (). В качестве примера: data = ['aa', 'bb', 'cc'].

Это для построения фрейма, чтобы поместить его в текстовый файл, открываемый Wireshark в определенном формате (здесь проблема не в этом, все работает отлично).

Как показано в документации: print(binascii.crc32(b"hello world")) работает.

Я пытался преобразовать данные в двоичный файл с помощью bin (), которая дала мне

data = ['10101010', '10111011', '11001100']

Однако он никогда не рассматривается как двоичный.

Я попытался преобразовать его с помощью метода bytes (), но только снова смог преобразовать его в ASCII.

def toBin(data):
    data2=[]
    for iBcl in range (1,len(data)):
        if iBcl%2!=0:
            binary=bin(int(data[iBcl-1]+data[iBcl],16))[2:]
            data2.append(binary)
    print(data2)
    return data2

data="aabbcc"
data2=toBin(data)
print(binascii.crc32(data2[0]+data2[1]+data2[2]))

Согласно онлайн-калькулятору CRC32, результат должен быть 0xBE4DF84C но у меня следующая ошибка: TypeError: a bytes-like object is required, not 'str'

Я не получаю сообщение об ошибке, используя метод bytes (), но CRC32 рассчитывается на основе символа ASCII, и это дает мне неверный crc.

1 Ответ

0 голосов
/ 21 мая 2019

У вас есть список шестнадцатеричных данных. Вы можете преобразовать каждый байт с помощью binascii.unhexlify, а затем объединить все:

b = b''.join((binascii.unhexlify(i) for i in data))
print(b)

дает, как и ожидалось

b'\xaa\xbb\xcc'

Вы можете контролировать crc32:

print(hex(binascii.crc32(b)))

, что дает:

0xbe4df84c
...