2016-10-02 7 views
0

Я пытаюсь использовать здесь 16-битную контрольную сумму Флетчера. В принципе, моя программа имитирует трафик по физическому уровню путем «отправки» и «приема» пакетов между двумя виртуальными объектами. Я распечатываю пакеты с обеих сторон, и они соответствуют, но я получаю другую контрольную сумму, рассчитанную на принимающей стороне.контрольная сумма fletcher, дающая разные значения

структура пакета:

#define MESSAGE_LENGTH 20 
struct pkt { 
    int seqnum; 
    int acknum; 
    int checksum; 
    char payload[MESSAGE_LENGTH]; 
}; 

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

/* 
* Computes the fletcher checksum of the input packet 
*/ 
uint16_t calcChecksum(struct pkt *packet) { 
    /* the data for the checksum needs to be continuous, so here I am making 
     a temporary block of memory to hold everything except the packet checksum */ 
    size_t sizeint = sizeof(int); 
    size_t size = sizeof(struct pkt) - sizeint; 
    uint8_t *temp = malloc(size); 
    memcpy(temp, packet, sizeint * 2); // copy the seqnum and acknum 
    memcpy(temp + (2*sizeint), &packet->payload, MESSAGE_LENGTH); // copy data 

    // calculate checksum 
    uint16_t checksum = fletcher16((uint8_t const *) &temp, size); 
    free(temp); 
    return checksum; 
} 

/* 
* This is a checksum algorithm that I shamelessly copied off a wikipedia page. 
*/ 
uint16_t fletcher16(uint8_t const *data, size_t bytes) { 
    uint16_t sum1 = 0xff, sum2 = 0xff; 
    size_t tlen; 

    while (bytes) { 
      tlen = bytes >= 20 ? 20 : bytes; 
      bytes -= tlen; 
      do { 
        sum2 += sum1 += *data++; 
      } while (--tlen); 
      sum1 = (sum1 & 0xff) + (sum1 >> 8); 
      sum2 = (sum2 & 0xff) + (sum2 >> 8); 
    } 
    /* Second reduction step to reduce sums to 8 bits */ 
    sum1 = (sum1 & 0xff) + (sum1 >> 8); 
    sum2 = (sum2 & 0xff) + (sum2 >> 8); 
    return sum2 << 8 | sum1; 
} 

Я не знаю много о контрольных суммах и я скопировал этот алгоритм на странице, которую я нашел, поэтому, если кто-нибудь может понять, почему контрольные суммы для двух одинаково идентичных пакетов различны, я был бы очень признателен. Спасибо!

ответ

1

Проблема возникает из-за того, что вы не передаете адрес temp данных в функцию контрольной суммы, а скорее адрес, в котором переменная temp хранится в стеке.

Вы должны изменить

uint16_t checksum = fletcher16((uint8_t const *) &temp, size); 

в

uint16_t checksum = fletcher16((uint8_t const *) temp, size); 
               ^no & operator 
+0

Спасибо! Теперь я чувствую себя глупо. Первоначально temp не был указателем, но когда я изменил это, я забыл изменить вызов fletcher. – xjsc16x

 Смежные вопросы

  • Нет связанных вопросов^_^