может кто-нибудь объяснить, что делает этот код? я должен интерпретировать этот код и использовать его в качестве кода контрольной суммы, но я не уверен, что это абсолютно правильно. Особенно, как работают переливы и что означает *cp, const char* cp
и sum & 0xFFFF
? Основная идея заключалась в том, чтобы взять ввод как строку от пользователя, преобразовать его в двоичную форму по 16 бит за раз. Затем суммируйте все 16 бит вместе (в двоичном формате) и получите 16-разрядную сумму. Если в добавлении есть бит переполнения, добавьте это к lsb
окончательной суммы. Затем возьмите дополнение к результату.код контрольной суммы в C++
Насколько близок этот код к выполнению вышеуказанного?
unsigned int packet::calculateChecksum()
{
unsigned int c = 0;
int i;
string j;
int k;
cout<< "enter a message" << message;
getline(cin, message) ; // Some string.
//std::string message =
std::vector<uint16_t> bitvec;
const char* cp = message.c_str()+1;
while (*cp) {
uint16_t bits = *(cp-1)>>8 + *(cp);
bitvec.push_back(bits);
cp += 2;
}
uint32_t sum=0;
uint16_t overflow=0;
uint32_t finalsum =0;
// Compute the sum. Let overflows accumulate in upper 16 bits.
for(auto j = bitvec.begin(); j != bitvec.end(); ++j)
sum += *j;
// Now fold the overflows into the lower 16 bits. Loop until no overflows.
do {
sum = (sum & 0xFFFF) + (sum >> 16);
} while (sum > 0xFFFF);
// Return the 1s complement sum in finalsum
finalsum = 0xFFFF & sum;
//cout<< "the finalsum is" << c;
c = finalsum;
return c;
}
По крайней мере, его дополнение должно быть либо 0xFFFF^sum, либо 0xFFFF - sum: цикл 'while (* cp)' неверен, так как он не может корректно обрабатывать например строка "a". (Что, если есть мусор сразу после завершающего ascii нуля? –
Есть ли причина против использования стандартного хеш-кода, такого как SHA (http://en.wikipedia.org/wiki/Secure_Hash_Algorithm)? –
BTW. Этот тип Q принадлежит codeview. –