2017-06-08 2 views
2

Pour fond, je suis en train de calculer une somme de contrôle pour un paquet IP qui est stocké dans la mémoire constante (ne peut pas le modifier en place). Avant de faire la somme de contrôle, je suis censé faire semblant la somme de contrôle existant dans le paquet est 0. Plutôt que de copier toutes les données de mémoire tampon temporaire, et stocker 0, je voudrais faire une somme de contrôle de l'ensemble du paquet, puis soustrayez la somme de contrôle existante à partir du résultat.les compléter de 0 - 0

Pour ce faire, je cherchais une version de complément de la soustraction que j'ai trouvé here. Malheureusement, si je l'utiliser, et soustraire 0 de 0, je reçois 0x1111 au lieu de l'attendre 0:

  1. Convertir 0 à son complément: [1111]
  2. Ensuite, nous ajoutons 0: [1111]
  3. pas peu de trop-plein, donc nous avons fini ...

Je me serais attendu à 0 - 0 à 0 - ce que je manque?

+8

Il y a deux représentations de 0 en complément à: +0 (0000) et -0 (1111). –

+1

Qu'est-ce que le complément vous achète? –

+0

Au lieu de copier le tampon entier, vous pouvez sauvegarder la somme de contrôle actuelle, la mettre à 0, calculer la somme de contrôle, puis remettre l'original, en supposant que vous ne voulez pas utiliser la nouvelle somme de contrôle que vous avez calculée. – clcto

Répondre

1

Vous n'avez pas besoin de soustraire.

Si la somme de contrôle est valide, le calcul de la somme de contrôle sur l'ensemble du paquet, y compris la somme de contrôle, devrait vous donner 0. Si le résultat n'est pas 0, le paquet est corrompu.

Voici comment les routeurs valident la somme de contrôle.

0

Je vous conseille de lire ce tutoriel sur un complément à

https://courses.cs.vt.edu/csonline/NumberSystems/Lessons/SubtractionWithOnesComplement/index.html

Je pense que cela est facile:

0000 - 0000 = 0000 + 1111 = 1111 

Comme le dernier 1111 est dans la forme de Complement d'un, nous savons que cela est un nombre négatif pour avoir un 1. La dernière opération est un complément (1111).

La réponse finale est - 0000. Comme vous le savez un calcul de complément de Cons de One est celui ayant deux forme pour présentant zéro 0.