/Checksum

Primary LanguageJava

Checksum

개요

Checksum Program

Checksum은 네트워크를 통해서 전송된 데이터의 값이 변경되었는지를 검사하는 값입니다. 이러한 무결성을 통해서 네트워크를 통해서 수신된 데이터에 오류가 없는지 여부를 확인합니다.

Checksum Project는 임의의 데이터들을 포함하고 있는 입력 파일을 읽어서 Checksum을 생성하고, 그에 맞는 결과 파일을 출력하도록 하는 프로젝트입니다.
본 프로그램은 사용자가 손 쉽게 체크섬을 생성하고 확인할 수 있도록 GUI 형태로 개발되었습니다.

image


개발 환경

 OS: Windows 10 Home  IDE: Eclipse  Language: Java


구조

 Class: checksum  Method

  • mainFrame: GUI 생성
  • main: checksum 객체 생성 및 실행
  • getFile: checksum 생성 버튼을 누르면 실행, 입력 파일의 데이터를 반복해서 읽음
  • writeFile: 결과 파일 출력
  • bitSum: 이진수 덧셈 연산
  • upCarry: Carry값 추가 연산
  • complementTrans: 1의 보수 적용
  • toBinary: 입력 데이터를 8비트 이진수로 변환
  • actionPerforemd: GUI 버튼 클릭 리스너 정의

동작 방법

입력 데이터 파일 생성

프로그램을 실행하기 전에 입력 데이터 파일을 생성하고 프로젝트 폴더에 넣습니다. 그리고 전송할 데이터를 삽입해줍니다.
입력 파일명은 ‘input.txt’입니다.

image


프로그램 실행

프로그램을 실행시키면 다음과 같은 화면을 확인할 수 있습니다. 여기서 ‘CheckSum 생성’ 버튼을 클릭하면 CheckSum 생성 연산이 진행되고 ‘종료’버튼을 누르면 프로그램이 종료됩니다.

image


CheckSum 생성

CheckSum 생성 버튼을 누르게 되면 Checksum 생성 연산이 진행됩니다. 여기서 입력 파일의 상태에 따라 각각 다른 출력을 하게 됩니다.

입력 파일과 데이터가 정상적으로 존재할 경우

image

입력 파일이 존재하지 않는 경우

image

입력 데이터가 올바르지 않는 경우

image

결과 Checksum 파일 생성

image


개발 내용

본 프로그램은 다음과 같이 입력파일의 데이터들을 추출하여 Checksum을 생성합니다.

(1) 입력파일 내부의 하나의 데이터 읽기

  • 프로젝트 폴더에서 ‘input.txt’에 해당하는 파일 객체를 생성한 후, 각각의 데이터를 반복해서 읽어오면서 연산을 진행합니다.

(2) 데이터를 이진수 7비트로 변환

  • 읽은 데이터를 이진수 7비트로 변환해줍니다. 이진수로의 변환은 ‘toBinary(char character)’ 함수가 담당합니다.

(3) 변환된 7비트에 짝수 패리티 비트를 추가해서 8비트로 변환하여 temp 배열에 누적 저장

  • ‘toBinary(char character)’ 함수에서 이진수로 변환할 때, 1이 삽입되는 횟수를 조회하여 짝수 패리티 비트의 값을 지정합니다.

(4) (1) ~ (3) 과정을 반복하여 누적된 비트가 16비트가 될 경우, Checksum 데이터 배열과 누적된 비트 배열간 2진수 덧셈을 진행

  • ‘bitSum’ 함수에서 temp 배열의 길이 값을 확인하여 16비트인지 아닌지를 확인합니다. 16비트라면 아래 코드와 같이 이진수 덧셈 연산을 진행합니다.

(5) Carry 값이 발생할 경우 Checksum 데이터 배열 맨 뒷 자리에 Carry 값을 더함

  • 비트 연산 결과 Carry가 존재하면 Carry값을 더해주는 연산을 진행합니다.

(6) temp 배열을 비우고 하나의 분기를 종료하고 다음 데이터를 참조하여 다시 (1) ~ (5) 과정을 반복하여 Checksum 데이터 배열에 값 저장

  • temp 배열을 비우고 (1) ~ (5) 과정을 더 이상 읽어올 데이터가 없을 때 까지 진행합니다.

(7) 데이터를 모두 읽었다면 현재의 Checksum값에 1의 보수를 취한 값을 최종 체크섬으로 선정 후 파일 출력

  • 연산이 모두 끝난다면 마지막 체크섬 값에 1의 보수를 취해줍니다. 그리고 이 값을 최종 체크섬으로 선정하여 결과UI 및 파일을 출력합니다.

 16비트 단위로 떨어지지 않는 데이터는 배열 우측에 8bit를 0으로 저장하여 계산

위의 과정과 규칙에 따라 프로그램의 CheckSum 생성이 진행됩니다.


테스트

본 프로그램이 어떠한 상황에도 잘 동작하는지를 확인하기 위해 여러 번의 테스트를 수행하였습니다.

1. 체크섬 확인

수신자의 입장에서 수신받은 체크섬과 모든 데이터의 체크섬을 계산한 결과의 합이 1111111111111111이 됨을 확인


2. 일반적인 입력

image


3. 입력 파일이 존재하지 않는 경우

image


4. 입력 파일의 데이터 형식이 올바르지 않는 경우

image


5. 데이터 길이가 엄청 긴 경우

데이터 길이가 약 10만일 경우에도 1초내 출력 확인.

image


6. 체크섬 합산 도중 프로그램이 종료될 경우

비정상적인 종료가 발생하여도 파일이 정상적으로 닫히는 것을 확인.


7. 짝수 패리티 값 삽입

비트열의 1의 값 개수를 정상적으로 체크하여 올바른 짝수 패리티 값이 삽입됨을 확인.


8. 입력 데이터의 개수가 홀수 개

입력 데이터가 홀수 개인 경우, 마지막 문자를 읽었을 때 문자에 해당하는이진수 8비트와 남는 8비트를 00000000으로 붙여 이진수 합 연산을 통해 연산이 정상적으로 이루어지는 것을 확인.


9. 입력 데이터의 개수가 1개

입력 데이터가 1개인 경우에도 정상적인 체크섬이 생성됨을 확인

image