누군가이 코드의 기능을 설명해 주시겠습니까? 이 코드를 해석하고 체크섬 코드로 사용해야하지만 절대적으로 정확한지 확실하지 않습니다. 특히 오버 플로우가 작동하는 방식과 *cp, const char* cp
및 sum & 0xFFFF
의 의미는 무엇입니까? 기본 아이디어는 사용자로부터 문자열을 입력 받아 한 번에 16 비트 씩 변환하는 것이 었습니다. 그런 다음 여러 16 비트를 모두 합쳐 (2 진수로) 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^합계 또는 0xFFFF-sum 중 하나 여야합니다. 루프 'while (* cp)'가 잘못 처리되었습니다. 올바르게 처리 할 수 없으므로 예 문자열 "a". (아스키 종료 후 가비지가 생기는 경우 –
SHA (http://en.wikipedia.org/wiki/Secure_Hash_Algorithm)와 같은 표준 해시 코드 사용에 대한 이유가 있습니까? –
BTW.이 종류의 Q가 속합니다 –