Контрольная сумма в переполнении стека

Мне нужна помощь с написанием кода на C ++ для выполнения 16-битной контрольной суммы.

Идея состоит в том, чтобы получить данные от пользователя (строку), преобразовать их в двоичную форму, затем вычислить контрольную сумму и поместить в мой пакет данных. У меня нет никакой спецификации типа контрольной суммы … Я думал, что XOR 16-ти битный будет хорошей идеей. У меня есть следующий пакет класса:

class packet
{
private:
string message;
unsigned int checksum;  // this is a 16 bit checksum
unsigned int seqNum;

public:
packet(string str, unsigned int seq);
void setMessage(string str);
void setSeqNum(unsigned int num);
string getMessage();
int getLength();
unsigned int calculateChecksum();
int getChecksum();
bool getSeqNum();
};

Я должен рассчитать мою контрольную сумму здесь, учитывая выше:

packet::packet(string str, unsigned int seq)
{
this->message = str;
this->seqNum = seq;
// calculate checksum here
checksum = calculateChecksum(); //HOW TO CODE THIS FUNCTION?
}

Пожалуйста помоги. Я новичок в C ++ и C.

2

Решение

Вы можете использовать контрольную сумму, используемую в заголовке IPv4, это 16 бит:

http://en.wikipedia.org/wiki/IPv4_header_checksum

Или проверьте CRC16:
http://en.wikipedia.org/wiki/Crc16

Вы можете найти больше алгоритмов, если немного погуглите:

http://en.wikipedia.org/wiki/List_of_hash_functions

http://en.wikipedia.org/wiki/Category:Checksum_algorithms

Чтобы реализовать вашу функцию, просто сначала последовательно конвертируйте каждую пару символов в вашем String message и передать его алгоритму контрольной суммы.

Если у вас нечетное количество байтов, вы должны правильно заполнить нулями последний байт (проверьте документы для вашего индивидуального алгоритма, который вы выбрали, или просто вычислите 16-битное значение последней пары, так как последний отсутствующий символ был равен нулю).

После того, как вы обработали сообщение, добавьте номер seq в has и сохраните результат контрольной суммы в своем checksum переменная.

Если вы хотите проверить, не ошиблись ли вы в процессе, многие алгоритмы (циклические) выдают нулевой результат после того, как вы хэшируете все сообщение, включая его CRC. Если вы получаете ноль, это означает, что сообщение не повреждено или ваш алгоритм работает правильно, когда вы его тестируете.

4

Другие решения

реализация функции происходит следующим образом:

unsigned int packet::calculateChecksum()
{
// here you can use the members of packet, make a for-loop and other things.
}

Конструктор уже реализован?

1

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector