#include <stdio.h>

#include <stdlib.h>

#include <time.h>




unsigned short calculation_Checksum(char* m) //char 배열의 메세지를 받아 short형의 checksum 값을 반환한다.

{

int i = 0, L = 0;

int temp = 0;

unsigned short checksum_s = 0;          // 체크섬 값

int sum = 0;

int Left_sum;

int Right_sum;


for(i = 0; m[i] != '\0'; i++)

{

L++;

}


if(L%2 == 0)

{

for(i = 0; i < L; i = i+2)       // 메세지를 16비트 단위로 나누어 합치는 과정이다.

{

temp = m[i];

printf("%x ", temp);

temp = (temp << 8);

printf("%x ", temp);

temp = temp | m[i+1];

printf("%x ", temp);

sum += temp;

printf("%x ", sum);

}

}


else if(L%2 != 0)

{

for(i = 0; i < L-1; i = i+2)

{

temp = m[i];

printf("%x ", temp);

temp = (temp << 8);

printf("%x ", temp);

temp = temp | m[i+1];

printf("%x ", temp);

sum += temp;

printf("%x ", sum);

}

temp = m[L-1];

temp = (temp << 8);

printf("%x ", temp);

sum += temp;

printf("%x ", sum);


}

Left_sum = (sum >> 16);

while(Left_sum != 0)

{

Right_sum = sum&(0x0000FFFF);

sum = Left_sum+Right_sum;

Left_sum = (sum >> 16);

}


printf("%x ", sum);


checksum_s = sum;

printf("%x ", checksum_s);

checksum_s = (~checksum_s);             // 1의 보수 취하기

    printf("%x ", checksum_s);


return checksum_s;                      // 최종적으로 나온 체크섬 값 반환


}



int check_Checksum(char* m)  //char 배열의 체크섬이 합쳐진 메시지를 받아 결과값을 반환.

{

int i = 0, L = 0;

int temp = 0;

unsigned short checksum_r = 0;

int sum = 0;

int Left_sum = 0;

int Right_sum = 0;



for(i = 0; m[i] != '\0'; i++)

{

L++;

}

printf("%d ", L);


if(L%2 == 0)

{

for(i = 0; i < L; i = i+2)       // 메세지를 16비트 단위로 나누어 합치는 과정이다.

{

temp = m[i];

printf("%x ", temp);

temp = (temp << 8);

printf("%x ", temp);

temp = temp | m[i+1];

printf("%x ", temp);

sum += temp;

printf("%x ", sum);

}

}


else if(L%2 != 0)

{

for(i = 0; i < L-3; i = i+2)

{

temp = m[i];

printf("%x ", temp);

temp = (temp << 8);

printf("%x ", temp);

temp = temp | m[i+1];

printf("%x ", temp);

sum += temp;

printf("%x ", sum);

}

temp = m[L-3];

temp = (temp << 8);

printf("%x ", temp);

sum += temp;

printf("%x ", sum);


temp = m[L-2];

printf("%x ", temp);

temp = temp & (0x000000FF);

printf("%x ", temp);

temp = (temp << 8);

temp = temp | (m[L-1]&(0x000000FF));

printf("%x ", temp);

sum += temp;


printf("%x ", sum);


}


Left_sum = (sum >> 16);

while(Left_sum != 0)

{

Right_sum = sum&(0x0000FFFF);

sum = Left_sum+Right_sum;

Left_sum = (sum >> 16);

}

checksum_r = (~sum);             //1의 보수 취하기

printf("%x ", checksum_r);


if(checksum_r == 0)                     //에러가 없다면 1를 반환한다.

return 1; 


else

return 0;                           //에러가 발견되면 0을 반환.


}



void main()

{

int i, q, R, Error;

char input_m[500];

char s_m[500];

unsigned short checksum;

unsigned short c_temp;

    unsigned short c_temp2;

int receive = 0;

srand(time(NULL));



printf("메세지를 입력하세요 : ");

scanf("%s", input_m);



checksum = calculation_Checksum(input_m);  //메세지를 체크섬 계산 함수로 보내어 체크섬 값을 반환한다.



c_temp = (checksum >> 8);               //받은 체크섬을 메세지에 넣기 위해 8비트로 나누는 과정

printf("%x ", c_temp);

c_temp2 = checksum&(0x00FF);

printf("%x ", c_temp2);



for(i = 0; input_m[i] != '\0'; i++)     //체크섬을 넣기 위한 메세지를 복사하는 과정. 여기서 배열의 끝부분 i를 구한다.

s_m[i] = input_m[i];



s_m[i] = c_temp;

printf("%x ", s_m[i]);

s_m[i+1] = c_temp2;

s_m[i+2] = '\0';              //8비트로 나눈 체크섬을 메세지 배열 뒤에 삽입.

printf("%x ", s_m[i+1]);

printf("%s", s_m);


printf("에러를 생성하실건가요? 예->1 아니오->아무 키 입력");   // 에러 생성 여부 질문

scanf("%d", &q);


if(q == 1)                   // 에러 생성 파트. 난수를 취해서 메세지 내 배열 중 하나에 임의의 난수를 넣는다.

{

R = rand()%(i-1);           

Error = rand();

s_m[R] = Error;

}


receive = check_Checksum(s_m);   //체크섬을 넣은 메세지를 검사 함수로 보낸다. 에러가 없으면 1, 있으면 0을 반환한다.



if(receive == 1)

printf("메세지 에러 없음!! ");

else

printf("에러 발견!! ");


}





체크섬 관련 코딩을 하고 있는데 개인적으로 문제가



c_temp = (checksum >> 8);               //받은 체크섬을 메세지에 넣기 위해 8비트로 나누는 과정

printf("%x ", c_temp);

c_temp2 = checksum&(0x00FF);

printf("%x ", c_temp2);



for(i = 0; input_m[i] != ''; i++)     //체크섬을 넣기 위한 메세지를 복사하는 과정. 여기서 배열의 끝부분 i를 구한다.

s_m[i] = input_m[i];



s_m[i] = c_temp;

printf("%x ", s_m[i]);

s_m[i+1] = c_temp2;

s_m[i+2] = '';              //8비트로 나눈 체크섬을 메세지 배열 뒤에 삽입.

printf("%x ", s_m[i+1]);

printf("%s", s_m);



이쪽 부분입니다.


체크섬 생성 함수를 통해 받은 16진수 4자리 숫자를


2자리씩 쪼개서


문자열 뒷부분에 집어 넣는게 목표인데


어떤 경우에는 정상대로 XX, XX 순으로 들어가는데


막 FFFFFFXX, FFFFFFXX로 삽입되는 경우도 있습니다.(당연히 뒤에 의도치 않은 상황이 발생하더군요)


강제로 &(000000FF) 같은 함수를 넣어도 변화가 없습니다. ;;


제가 어디서 잘못 입력한 것일까요?