2013-03-04 2 views
1

Я пытался реализовать 5-битный CRC с генератором CRC 100101. Однако этот код не отражает аппаратные Xor и регистры сдвига в CRC; На аппаратном уровне, мы имеем следующее:Python: реализация CRC с использованием регистров xor и shift

enter image description here

Как это может быть реализовано на Python?

В разъяснении, мне было интересно, если есть какой-то код, который имеет дело с побитового исключающего и операторы сдвига < < как подход для решения этой проблемы

ответ

3

Я не уверен, что вы просите - вам код пока выглядит хорошо, и, как вы заявляете, он дает правильные результаты.

Я могу указать вам на структуру данных collections.deque в стандартной библиотеке, которую я считаю весьма полезной для представления регистров сдвига, потому что она предоставляет метод rotate() для выполнения такого кругового сдвига.

Этот код дают одинаковые результаты, как ваш код:

from collections import deque 

deque_crc = deque([0,0,0,0,0],maxlen=5) 

myID.extend(deque_crc) 

for x in myID: 
    deque_crc.rotate(-1) 
    deque_crc[2] = (deque_crc[2] + deque_crc[4]) % 2 
    deque_crc[4] = (deque_crc[4] + x) % 2 

myID[-5:] = deque_crc 

print myID 

EDIT:

Поскольку вы просите о реализации побитового алгоритма вы можете оформить эти источники:

+0

Спасибо! Как пояснение, мне было интересно, есть ли какой-то код, который имеет дело с бит-мутными операциями xor и shift << в качестве подхода к решению этого. но тогда я думаю, я не могу разобраться с списками, которые, как я думаю. (Новый для python) – Ever

1

Если вы действительно хотите использовать код CRC (в отличие от изучения их реализации), вы можете найти модуль Python crcmod очень полезным. Я использую его в течение многих лет, и он очень прост в использовании. Просто введите полином и получите функцию CRC, готовую обработать ваши данные.

Он может, однако, не поддерживать 5-битные полиномы CRC.

0

Однако этот код не отражает аппаратные Xor и сдвиговые регистры в CRC;

Он делает!

Это:

CRC[0] = CRC[1] 
CRC[1] = CRC[2] 
CRC[2] = CRC[3] 
CRC[3] = CRC[4] 
CRC[4] = input 

является модель регистра сдвига.

(Something+1) %2 - один из способов представления операции XOR.

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