2017-06-08 20 views
2

バックグラウンドでは、定数メモリに格納されている(それを修正することはできません)IPパケットのチェックサムを計算しようとしています。チェックサムを行う前に、私はパケットの既存のチェックサムを0にしようとしています。すべてのデータを一時バッファにコピーして0を格納するのではなく、パケット全体のチェックサムを行いたい結果からの既存のチェックサム。の1の補数0 - 0

これを行うには、私はhereという1つの補数の減算を探していました。私はこれを使用し、0から0を引く場合は残念ながら、私の代わりに予想さ0の0x1111を取得:

  1. 1の補数に変換0:[1111]
  2. 次に、我々は0を追加します。[1111]
  3. なしオーバーフロービットに、私たちは...

をやっている私は0期待しているだろう - 0と0を - 私は何をしないのですか?

+8

0の1の補数には、+0(0000)と-0(1111)の2つの表現があります。 –

+1

補足は何を購入しますか? –

+0

バッファ全体をコピーするのではなく、計算した新しいチェックサムを使用しないことを前提に、現在のチェックサムを保存して0に設定し、チェックサムを計算して元の値に戻します。 – clcto

答えて

1

あなたは引き算する必要はありません。

チェックサムが有効な場合、チェックサムを含むパケット全体のチェックサムを計算すると、0が返されます。結果が0でない場合、パケットは破損しています。

ルータがチェックサムを検証する方法です。

0

私は1の補数

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

にこのチュートリアルを読むことをお勧め私はこれは簡単だと思います:

0000 - 0000 = 0000 + 1111 = 1111 

最後1111は1の補数形式で、我々はこれがあることを知っているとおり先頭に1があることを示す負の数値です。 最後の操作は補集合です(1111)。

最終回答は- 0000です。 ご存じのように、補数計算の短所は、という2つの形式を持ち、ゼロを示すものです。0です。

関連する問題