숙제 1 (체크썸)
체크썸은중복검사중에서가장단순한형태로서, 전송될데이터를8-비트(바이트), 16-비트, 24-비트, 혹은32-비트등의단위로나누고, 나누어진데이터값을모두더한값을전송할데이터의끝부분에추가하여전송하는기법이다. 데이터를수신하는측에서는수신된데이터를송신측에서작업한것과같은작업을반복하여작은단위로나누어진데이터의합을계산한다. 이합이수신된데이터의끝부분에추가된체크썸과같은지를검사하여수신된데이터에손상이있는지의여부를판단하게된다.이체크썸에도구현방법에따라여러가지의변형이있을수있다. 다음의예는그중의한가지방법이다.
1. 송/수신되는데이터의크기는32-비트이며, 데이터를8-비트(바이트) 단위로나누어서체크썸을계산한다.
2. 32-비트중에서실제데이터는높은자리를차지하는3-바이트이며, 체크썸은가장낮은자리를차지하는한바이트에수록한다.
3. 체크썸을계산할때는먼저실제데이터가수록된3-바이트를바이트단위로나누고, 그바이트값을모두더한다.
4. 더한값이256보다크거나같은경우에는, 그값이256 보다작아질때까지, 256을계속해서뺀다.
5. 최종적으로단계4에서계산한값을255에서뺀값을체크썸값으로정한다.
#include<iostream>
using namespace std;
int main(){
unsigned int num=0x00;
cin>>num;
int arr1[32]={0x00,};
int arr2[4]={0x00,};
for(int i=0;i<32;i++) arr1[31-i]=(num>>i)&0x01;
for(int j=0;j<4;j++){
int num=0x00;
for(int k=0;k<8;k++) num=(num<<1)|(arr1[j*8+k]);
arr2[j]=num;
}
int check=arr2[0]+arr2[1]+arr2[2];
while(1){
if(check<256){
check=255-check;
break;
}
check-=256;
}
if(check==arr2[3]) cout<<1<<endl;
else cout<<0<<endl;
}
'코딩테스트' 카테고리의 다른 글
[C++] (백준 1463번) 1로 만들기 (0) | 2022.01.05 |
---|---|
[C++] 해밍코드 (0) | 2021.07.07 |
[C++] MultiMax (0) | 2021.06.29 |
[C++] 괄호 (0) | 2021.06.29 |
[C++] 방의 크기 구하기 (0) | 2021.06.29 |