반응형
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 등을 사용해야 함
반응형
'프로그래밍 > 작은 메모' 카테고리의 다른 글
| C, C++ 터미널 출력 색상 변경 (0) | 2025.10.20 |
|---|---|
| Modbus와 CRC16, CRC32 데이터 유효성 검사 (0) | 2025.10.17 |
| Ubuntu 터미널 명령어 반복 (0) | 2025.10.17 |
| Ubuntu USB 장치 연결 고정 (ex. 카메라 2대) (0) | 2025.10.13 |
| Ubuntu 22.04 ROS2 humble 설치 (1) | 2025.10.09 |