구분 | 설명 | 예시 | 안전성 |
---|
포인터 캐스팅 | *(uint32_t*)data 처럼 직접 메모리를 해석 | 엔디안에 따라 값이 바뀜 | ❌ 매우 위험 (엔디안 의존) |
비트 시프트 조합 | read_be() , write_be() 처럼 바이트 위치를 수동 조절 | 항상 동일한 결과 | ✅ 안전하고 portable |
memcpy() | 바이트 배열을 그대로 복사 (엔디안은 유지됨) | 엔디안에 따라 해석해야 함 | ⚠️ 보조 처리 필요 |
network byte order API | htonl , ntohl 등 사용 | 플랫폼별로 Big/Little 변환해줌 | ✅ 네트워크 표준과 호환 |
🧪 디버깅 예시 (리틀 엔디안 시스템 기준)
uint8_t data[4];
write_be(data, 0x12345678);
// 메모리 확인 시:
data[0] == 0x12
data[1] == 0x34
data[2] == 0x56
data[3] == 0x78
// BUT!
uint32_t wrong = *(uint32_t*)data; // → 0x78563412 (틀린 해석)
// 올바른 방법
uint32_t correct = read_be(data); // → 0x12345678 (의도한 값)
① ✅ 실행 중인 시스템의 엔디안 감지 코드
#include <stdio.h>
int main() {
uint32_t x = 0x01020304;
uint8_t *p = (uint8_t *)&x;
if (p[0] == 0x01) {
printf("🔵 Big Endian 시스템입니다.\n");
} else if (p[0] == 0x04) {
printf("🟢 Little Endian 시스템입니다.\n");
} else {
printf("❓ 알 수 없는 엔디안 형식입니다.\n");
}
return 0;
}
uint32_t
값을 메모리에 저장한 뒤 uint8_t*
로 첫 바이트를 확인
- 결과:
0x01
→ Big Endian
0x04
→ Little Endian
② 🌐 네트워크 전송 시 엔디안 변환 함수 (POSIX/BSD/Socket API)
#include <arpa/inet.h> // 또는 <winsock2.h> (Windows)
uint32_t local_value = 0x12345678;
uint32_t network_order = htonl(local_value); // 호스트 → 네트워크(Big Endian)
uint32_t back_to_host = ntohl(network_order); // 네트워크 → 호스트
함수 | 의미 | 사용 대상 |
---|
htonl() | host to network long (32bit) | TCP/IP 전송 시 |
htons() | host to network short (16bit) | 포트번호 등 |
ntohl() | network to host long | 수신값 복원 |
ntohs() | network to host short | 수신 포트 복원 등 |
- 대부분 시스템은 리틀 엔디안, 하지만 네트워크 프로토콜은 Big Endian(Network Byte Order) 사용
- 그래서 항상
hton*
, ntoh*
를 통해 변환 후 송수신해야 함
답글 남기기