2013-11-21 2 views
0

누군가이 코드의 기능을 설명해 주시겠습니까? 이 코드를 해석하고 체크섬 코드로 사용해야하지만 절대적으로 정확한지 확실하지 않습니다. 특히 오버 플로우가 작동하는 방식과 *cp, const char* cpsum & 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; 

    } 
+1

적어도 하나의 보수는 0xFFFF^합계 또는 0xFFFF-sum 중 하나 여야합니다. 루프 'while (* cp)'가 잘못 처리되었습니다. 올바르게 처리 할 수 ​​없으므로 예 문자열 "a". (아스키 종료 후 가비지가 생기는 경우 –

+0

SHA (http://en.wikipedia.org/wiki/Secure_Hash_Algorithm)와 같은 표준 해시 코드 사용에 대한 이유가 있습니까? –

+0

BTW.이 종류의 Q가 속합니다 –

답변

0

나는 코드에서 몇 가지 문제를 참조하십시오

  1. cp이 제로에 대한 포인터가 입력 메시지를 들고 문자 배열을 종료합니다. while(*cp)에는 while 루프 몸체 cp이 2 씩 증가하는 문제가 있습니다 !!! 따라서 문자 배열의 끝 부분 인 \0을 건너 뛰는 것이 매우 쉽습니다 (예 : 입력 메시지의 문자 수가 2 개). 세그먼트 오류가 발생합니다.
  2. *(cp)*(cp-1)은 입력 메시지에서 인접한 두 문자 (바이트)를 가져옵니다. 그러나 왜 2 바이트 단어가 *(cp-1)>>8 + *(cp)에 의해 형성됩니까? 나는에 의해 16 비트 워드를 형성하는 것이 이치에 맞을 것이라고 생각한다. 즉 선행 문자가 상위 바이트에 있고 그 다음 문자가 16 비트 워드의 하위 바이트에있다.

대답을 얻으려면 상위 16 비트가 0이고 하위 16 비트가 합계와 같은 숫자를 계산하면됩니다. 0xFFFF은 비트 마스크입니다.

재미있는 점은 위의 코드조차도 요구 사항으로 언급 한 정확한 내용을 수행하지 않을 수 있습니다. 발신자와 수신자가 동일한 코드 조각을 사용하고 체크섬 생성 및 확인이 통과하는 한 양쪽 끝은 서로 일치합니다 :)

+0

당신의 코멘트가 정말로 도움이 되었기 때문에 고마워요. 나는 wana가 하나의 마지막 것을 알고 있습니다. ... uint ... sum은 32 비트 비트의 부호없는 정수를 의미합니다 : uint32? shoudlnt라고하면 그 다음에 16이 될 것입니까? – user899714

+0

비트 마스크는 무엇을합니까? 그리고 비트 마스크는 무엇을합니까? – user899714

+0

@ user899714 코드에 보완 값을 계산하는 것과 관련된 것이 없다고 생각합니다. 외설. [here] (http://courses.cs.vt.edu/~csonline/NumberSystems/Lessons/OnesComplement/index.html)와 같이 보수를 계산하는 방법은 google을 참조하십시오. uint_32t는 합계 (부호없는 32 비트 정수) 유형입니다. 즉, 32 비트의 최상위 비트 (MSB)는 부호 비트로 해석되지 않습니다. "마스킹"을 사용하면 관심있는 비트를 가져올 수 있으며 마스크에 의해 모두 제로화되므로 다른 비트는 무시할 수 있습니다. –