#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) 같은 함수를 넣어도 변화가 없습니다. ;;
제가 어디서 잘못 입력한 것일까요?
댓글 0