дополнение от 0 до 0

Для фона я пытаюсь вычислить контрольную сумму для IP-пакета, который хранится в постоянной памяти (не могу изменить его на месте). Прежде чем делать контрольную сумму, я должен притвориться, что существующая контрольная сумма в пакете равна 0. Вместо того, чтобы копировать все данные во временный буфер и сохранять 0, я хотел бы сделать контрольную сумму всего пакета, а затем вычесть существующая контрольная сумма из результата.

Для этого я искал версию вычитания с дополнением до единицы, которую нашел здесь. К сожалению, если я использую это и вычитаю 0 из 0, я получаю 0x1111 вместо ожидаемого 0:

  1. Преобразовать 0 в дополнение до единицы: [1111]
  2. Далее добавляем 0: [1111]
  3. нет бита переполнения, так что мы закончили...

Я бы ожидал, что 0 - 0 будет 0 - что мне не хватает?


person blackghost    schedule 08.06.2017    source источник
comment
Есть два представления 0 в дополнении до единиц: +0 (0000) и -0 (1111).   -  person Paul R    schedule 08.06.2017
comment
Что вам дает комплемент?   -  person n. 1.8e9-where's-my-share m.    schedule 08.06.2017
comment
Вместо того, чтобы копировать весь буфер, вы можете сохранить текущую контрольную сумму, установить для нее значение 0, вычислить контрольную сумму, а затем вернуть оригинал, предполагая, что вы не хотите использовать новую вычисленную контрольную сумму.   -  person clcto    schedule 08.06.2017
comment
@н.м. Контрольная сумма в заголовке IPv4 рассчитывается следующим образом: en.wikipedia.org/wiki/IPv4_header_checksum   -  person dbush    schedule 08.06.2017
comment
Спасибо. К сожалению, это параллельная система, и мой код технически не должен иметь права на запись в эту часть памяти. Я могу сделать комплимент до и после контрольной суммы, но это означает, что я не могу использовать ускорение так же эффективно.   -  person blackghost    schedule 08.06.2017
comment
@PaulR Примечание: C не требует, чтобы в дополнении к единице было 2 нуля. -0 может быть представлением ловушки или нормальным значением. Конечно, полная эмуляция дополнения до 2 будет иметь 2 нуля.   -  person chux - Reinstate Monica    schedule 08.06.2017


Ответы (2)


Вам не нужно вычитать.

Если контрольная сумма верна, вычисление контрольной суммы по всему пакету, включая контрольную сумму, должно дать вам 0. Если результат не равен 0, пакет поврежден.

Вот как маршрутизаторы проверяют контрольную сумму.

person dbush    schedule 08.06.2017

Я предлагаю прочитать этот учебник по One's Complement

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

Я думаю, это легко:

0000 - 0000 = 0000 + 1111 = 1111

Поскольку последний 1111 находится в форме дополнения до единицы, мы знаем, что это отрицательное число для наличия начального 1. Последняя операция - это дополнение (1111).

Окончательный ответ - 0000. Как вы знаете, недостатком расчета дополнения до единицы является наличие двух форм для представления нуля 0.

person EsmaeelE    schedule 08.06.2017