有人能解釋一下這段代碼在做什麼嗎?我必須解釋這段代碼並將其用作校驗和代碼,但我不確定它是否絕對正確。特別是溢出如何工作以及*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 zero終止之後有什麼垃圾怎麼辦? –
是否有反對使用像SHA這樣的標準哈希碼的原因(http://en.wikipedia.org/wiki/Secure_Hash_Algorithm)? –
BTW。這種Q屬於codereview。 –