120 votes

Comment est une somme de contrôle CRC32 est-il calculé?

Peut-être que je suis juste de ne pas l'avoir vu, mais CRC32 semble soit inutilement compliqué, ou insuffisamment expliqué n'importe où j'ai pu trouver sur le web.

Je comprends l'essentiel, c'est que c'est le reste d'un non-effectuer en fonction arithmitic de la division de la valeur de message, divisé par le polynôme, mais la mise en œuvre effective de il m'échappe. J'ai lu Un Guide Indolore À l'Erreur CRC Algorithmes de Détection, et je dois dire qu'il n'a pas été sans douleur. Il va sur la théorie plutôt bien, mais l'auteur n'arrive jamais à un simple "C'est elle." Il fait dire que les paramètres sont pour la norme CRC-32 algorithme est, mais il néglige de pondre clairement de quelle façon vous l'obtenir. La partie qui me surprend, c'est quand il dit "c'est elle" et puis, ajoute, "oh, en passant, il peut être inversé ou a commencé avec des conditions initiales différentes," et ne donnent pas de réponse claire de ce que la dernière méthode de calcul de la somme de contrôle CRC32 compte tenu de tous les changements qu'il a simplement ajouté.

De toute façon, en plus de cela, ne quelqu'un a une explication simple de la façon dont il est calculé. J'ai tenté de code en C comment la table est formée, et il est inclus ci-dessous:

for(i=0;i<256;i++)
{
    temp=i;
    for(j=0;j<8;j++)
    {
        if(temp & 1)
        {
            temp>>=1;
            temp ^=0xEDB88320;
        }
        else
        {
            temp>>=1;
        }
    }
    testcrc[i]=temp;
}

Mais ce qui semble générer des valeurs incompatibles avec les valeurs que j'ai trouvé ailleurs sur internet. Je pourrais utiliser les valeurs que j'ai trouvé, mais je voulais comprendre comment ils sont arrivés chez eux.

Toute aide à la compensation de ces incroyablement déroutant nombre serait très apprécié.

11voto

WhirlWind Points 8305

Un CRC est assez simple; vous prenez un polynôme représenté sous forme de bits et les données, et de diviser le polynôme dans les données (ou de vous représenter les données dans un polynôme et faire la même chose). Le reste, qui est entre 0 et le polynôme est de la CDE. Votre code est un peu difficile à comprendre, en partie parce qu'il est incomplet: temp et testcrc ne sont pas déclarées, de sorte qu'il est difficile de savoir ce qui est en cours d'indexation, et la quantité de données est en cours d'exécution par le biais de l'algorithme.

La façon de comprendre le Crc est d'essayer de calculer un peu à l'aide d'un petit morceau de données (16 bits ou plus) avec une courte polynôme -- 4 bits, peut-être. Si vous pratiquez de cette façon, vous allez vraiment comprendre comment vous pourriez aller sur le code.

Si vous le faites souvent, un CRC est assez lent à calculer dans le logiciel. Matériel de calcul est beaucoup plus efficace, et ne nécessite que quelques portes de.

7voto

jschmier Points 8088

En plus de la Wikipédia contrôle de redondance Cyclique et le Calcul de la CRC articles, j'ai trouvé un document intitulé Inversion de la CRC - la Théorie et la Pratique* pour être une bonne référence.

Il y a essentiellement trois approches pour le calcul d'un CRC: une approche algébrique, un peu de l'approche axée sur, et un tableau de l'approche axée sur la. Dans l'Inversion de la CRC - la Théorie et la Pratique*, chacun de ces trois algorithmes/approches est expliqué dans la théorie de l'accompagner dans l'ANNEXE, par une mise en œuvre pour le CRC32 dans le langage de programmation C.

* Lien PDF
L'inversion de la CRC – la Théorie et la Pratique.
HU Berlin Rapport Public
SAR-PR-2006-05
Mai 2006
Auteurs:
Martin Stigge, Henryk Plötz, Le Loup Müller, Jens-Peter Redlich

5voto

Joel Points 3899

Wikipedia a une très bonne référence sur les différents moyens de mise en œuvre de contrôles CRC.

1voto

compie Points 3773

CRC-32 est décrite dans la norme ISO 3309. Pour certains sampe code voir http://www.w3.org/TR/PNG-CRCAppendix.html

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X