2013-09-26 2 views
1

J'ai généré un entier CRC sur un tableau d'octets et l'ai converti en un tableau de 4 octets. J'ai utilisé this classe pour CRC16 qui utilise générateur polynomial = 0x1021; ce qui signifie 1 + x + x^5 + x^12 + x^16 J'envoie mon tableau d'octets et le CRC sur UDP au serveur. Du côté serveur, j'aime vérifier si le tableau d'octets a été correctement transmis. Si je comprends bien, je peux simplement diviser la matrice de données concaténée avec crc-array par le polynôme générateur. Ai-je bien compris? Et comment effectuer la division data+crc par polynôme générateur en Java? J'ai vu des solutions qui génèrent juste le code crc à nouveau sur les données et comparer si les codes crc résultants sont les mêmes, mais ce n'est peut-être pas la raison pour laquelle les codes crc sont faits.Java effectuer un contrôle crc (diviser bytearray par bytearray)

+0

Recalculer le CRC et comparer est la chose la plus simple à faire. –

+0

Incidemment, votre vérification n'est pas nécessaire car UDP garantit que l'octet [] sera identique à l'envoi car UDP effectue sa propre vérification en utilisant une somme de contrôle avant de remettre le datagramme. – markmnl

+0

c'est plus pour des raisons pédagogiques alors un cas d'utilisation, mais serait bien si vous avez une référence à cette déclaration;) – abimelex

Répondre

0

CRC est conçu pour que vous répétiez simplement le calcul CRC, mais avec les octets CRC ajoutés aux octets de données. De Wikipedia:

La validité d'un message reçu peut facilement être vérifié en effectuant le calcul ci-dessus, cette fois avec la valeur ajoutée au lieu de contrôle des zéros. Le reste doit être égal à zéro s'il n'y a pas d'erreurs détectables.

+1

Cela ne fonctionne que si le CRC n'a pas de pré ou de post-traitement, ce que la plupart font. L'approche courante consiste à faire ce que vous feriez avec n'importe quel algorithme de vérification, qui le calcule uniquement sur le message reçu et le compare à la valeur de contrôle reçue. –

+0

comme mon code fait une modification après le calcul de la somme de contrôle [crc & = 0xffff;] Je dois le faire comme vous l'avez dit mais j'accepte la réponse ci-dessus. – abimelex

+0

@MarkAdler Si le CRC dispose d'un pré-traitement ou d'un post-traitement, en quoi cela peut-il être utile? Ma compréhension du point de ces types de contrôles (CRC, parité) est que vous le calculez simplement pour l'ensemble du message reçu (y compris les bits de contrôle) et assurez-vous que le résultat est 0. – ford