Я пытаюсь вычислить последовательность проверки кадра (FCS) байта пакета Ethernet.Полином является 0x104C11DB7
.Я следовал алгоритму XOR-SHIFT, показанному здесь http://en.wikipedia.org/wiki/Cyclic_redundancy_check или здесь http://www.woodmann.com/fravia/crctut1.htm
Предположим, что информация, которая предположительно имеет CRC, составляет только один байт.Скажем, это 0x03.
шаг: pad с 32 битами вправо
0x0300000000
выровнятьполином и данные с левой стороны с их первым битом, который не равен нулю, и xor их
0x300000000 xor 0x209823B6E = 0x109823b6e
принимают выравнивание остатка и снова xor
0x109823b6e xor 0x104C11DB7 = 0x0d4326d9
Поскольку больше не осталось битов, CRC32 0x03 должен быть 0x0d4326d9
К сожалению, все реализации программного обеспечения говорят мне, что янеправильно, но что я сделал не так или что они делают по-другому?
Python говорит мне:
"0x%08x" % binascii.crc32(chr(0x03))
0x4b0bbe37
Онлайн-инструмент здесь http://www.lammertbies.nl/comm/info/crc-calculation.html#intr получает тот же результат.В чем разница между моими ручными вычислениями и алгоритмом, который использует упомянутое программное обеспечение?
ОБНОВЛЕНИЕ:
Оказывается, подобный вопрос уже был о переполнении стека:
Вы найдете ответ здесь Python CRC-32 горе
Хотя это не очень интуитивно понятно.Если вы хотите более формальное описание того, как это делается для фреймов Ethernet, вы можете обратиться к Стандартному документу Ethernet 802.3 Часть 3 - Глава 3.2.9 Поле последовательности проверки фреймов
Давайте продолжимпример сверху:
Обратный порядок бит вашего сообщения.Это представляет способ, которым они будут входить в приемник по крупицам.
0x03
, следовательно, равно 0xC0
Дополнить первые 32 бита вашего сообщения.Обратите внимание, что мы дополняем 32-битный одиночный байт.
0xC000000000 xor 0xFFFFFFFF = 0x3FFFFFFF00
Завершите метод Xor и Shift сверху.Примерно через 6 шагов вы получите:
0x13822f2d
Затем приведенная выше последовательность битов дополняется.
0x13822f2d xor 0xFFFFFFFF = 0xec7dd0d2
Помните, что мы изменили порядок битов, чтобы получить представление на проводе Ethernet на первом этапе.Теперь мы должны повернуть вспять этот шаг, и мы наконец выполним наш квест.
0x4b0bbe37
Кто бы ни придумал этот способ сделать это, он должен быть ...
Очень часто вы действительно хотите знать, что полученное вами сообщение верное.Для этого вы принимаете полученное сообщение, включая FCS, и выполняете те же шаги с 1 по 5, что и выше.Результатом должно быть то, что они называют остатком.Который является константой для данного полинома.В этом случае это 0xC704DD7B
.
Как mcdowella упоминает, что вы должны поиграться со своими битами, пока вы не сделаете это правильно, в зависимости от приложения, которое вы используете.