Ethernet CRC32 cálculo - software vs resultado algorítmico
Estou tentando calcular a FCS (Frame Check Sequence) de um pacote Ethernet byte a byte. O polinômio é0x104C11DB7
. Eu segui o algoritmo XOR-SHIFT visto aquihttp: //en.wikipedia.org/wiki/Cyclic_redundancy_chec ou aquihttp: //www.woodmann.com/fravia/crctut1.ht
Suponha que as informações que deveriam ter um CRC tenham apenas um byte. Digamos que seja 0x03.
step: pad com 32 bits para a direita
0x0300000000
alinhe o polinômio e os dados no lado esquerdo com o primeiro bit que não seja zero e xe eles
0x300000000 xor 0x209823B6E = 0x109823b6e
pegue o restante alinhado e xor novamente
0x109823b6e xor 0x104C11DB7 = 0x0d4326d9
Como não resta mais nada, o CRC32 de 0x03 deve ser0x0d4326d9
nfelizmente, todas as implementações de software me dizem que estou errado, mas o que fiz de errado ou o que elas estão fazendo de diferent
Python me diz:
"0x%08x" % binascii.crc32(chr(0x03))
0x4b0bbe37
A ferramenta online aquihttp: //www.lammertbies.nl/comm/info/crc-calculation.html#int obtém o mesmo resultado. Qual é a diferença entre o meu cálculo manual e o algoritmo que o software mencionado usa?
ATUALIZAR
Volta lá fora, já havia uma pergunta semelhante no estouro de pilha:
Você encontra uma resposta aquiPython CRC-32 desgraças
Embora isso não seja muito intuitivo. Se você quiser uma descrição mais formal de como isso é feito para os quadros Ethernet, consulte oEthernet Documento padrão 802.3 Parte 3 - Capítulo 3.2.9 Campo Sequência de Verificação de Quadro
Vamos continuar o exemplo acima:
Inverta a ordem dos bits da sua mensagem. Isso representa a maneira como eles entrariam no receptor pouco a pouc
0x03
portanto é0xC0
Complemente os primeiros 32 bits da sua mensagem. Observe que preenchemos o byte único com 32 bits novament
0xC000000000 xor 0xFFFFFFFF = 0x3FFFFFFF00
Conclua o método Xor e shift de cima novamente. Após cerca de 6 etapas, você obtém:
0x13822f2d
A sequência de bits acima é complementad
0x13822f2d xor 0xFFFFFFFF = 0xec7dd0d2
Lembre-se de que invertemos a ordem dos bits para obter a representação no fio Ethernet na etapa um. Agora temos que reverter essa etapa e finalmente cumprir nossa missão.
0x4b0bbe37
Quem criou essa maneira de fazê-lo deve ser ...
Muitas vezes você realmente quer saber que a mensagem que recebeu está correta. Para conseguir isso, leve sua mensagem recebida, incluindo o FCS, e siga as mesmas etapas de 1 a 5 acima. O resultado deve ser o que eles chamam de resíduo. O que é uma constante para um determinado polinômio. Nesse caso, é0xC704DD7B
.
Como mcdowella menciona que você precisa brincar com seus bits até acertar, dependendo do aplicativo que estiver usand