프로그래밍/작은 메모

XOR 데이터 무결성 확인(XOR 체크썸)

satnurn 2025. 10. 17. 15:58
반응형

XOR 체크섬은 데이터의 무결성을 단순하게 확인하는 방식으로,
모든 바이트를 비트 단위 XOR(^) 연산으로 누적하여 마지막에 1바이트(또는 정수형)로 결과를 만드는 방식.

CRC는 다항식을 이용한 방식으로 XOR 체크썸과 차이가 있음.

 

 

 


 

 

 # 기본 개념

  • XOR(배타적 논리합)
    • 0 ^ 0 = 0
    • 1 ^ 0 = 1
    • 0 ^ 1 = 1
    • 1 ^ 1 = 0

즉, 같은 비트는 0이 되고, 다른 비트는 1이 됩니다.

다르게 말하면

 A ^ A = 0 → 같은 값으로 XOR하면 0

 A ^ 0 = A → 0과 XOR하면 자기 자신

 

 

 


 

 

# 예시 

예를 들어 데이터가 다음과 같다고 가정

 
0x12, 0x34, 0x56

이걸 XOR로 모두 합치면:

 
0x12 ^ 0x34 = 0x26 0x26 ^ 0x56 = 0x70

체크섬 = 0x70

 (이진수로 바꿔 연산해보면 됨)

 

수신 측에서는 데이터를 받은 후 다시 같은 방식으로 XOR을 계산해서
송신된 체크섬과 같은지 비교하면 데이터가 올바른지 확인 가능.

 

 

 


 

 # C++ 예제 코드

 
#include <iostream>
#include <vector>

uint8_t xorChecksum(const std::vector<uint8_t>& data) {
    uint8_t checksum = 0;
    for (uint8_t byte : data) {
        checksum ^= byte;  // XOR 누적
    }
    return checksum;
}

int main() {
    std::vector<uint8_t> data = {0x12, 0x34, 0x56};

    uint8_t checksum = xorChecksum(data);
    std::cout << "XOR Checksum: 0x" << std::hex << (int)checksum << std::endl;

    // 검증 예시
    std::vector<uint8_t> received = {0x12, 0x34, 0x56, checksum};

    uint8_t verify = 0;
    for (uint8_t byte : received) verify ^= byte;

    if (verify == 0)
        std::cout << "데이터 무결성 OK" << std::endl;
    else
        std::cout << "데이터 오류" << std::endl;

    return 0;
}

 

 

 


 

 

 # 실행 결과

 
XOR Checksum: 0x70 → 데이터 무결성 OK

 

 

 


 

 

# 실제 응용

용도설명
시리얼 통신 패킷 끝에 XOR 체크섬 추가
센서 데이터 송수신 CRC 대신 가볍게 무결성 확인
임베디드 연산이 가벼워 MCU에서 많이 사용

 

 

 


 

 

 

# 주의할 점

  • XOR 체크섬은 단순하므로,
    비트 오류 2개가 같은 위치에서 발생하면 검출 못함 (약한 무결성 검사)
  • 더 안전하게 하려면 CRC16, CRC32 등을 사용해야 함

 

 

 

 

반응형