✅ 엔디안과 안전한 메모리 조작 요약


구분설명예시안전성
포인터 캐스팅*(uint32_t*)data처럼 직접 메모리를 해석엔디안에 따라 값이 바뀜❌ 매우 위험 (엔디안 의존)
비트 시프트 조합read_be(), write_be()처럼 바이트 위치를 수동 조절항상 동일한 결과✅ 안전하고 portable
memcpy()바이트 배열을 그대로 복사 (엔디안은 유지됨)엔디안에 따라 해석해야 함⚠️ 보조 처리 필요
network byte order APIhtonl, 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*를 통해 변환 후 송수신해야 함

코멘트

답글 남기기

이메일 주소는 공개되지 않습니다. 필수 필드는 *로 표시됩니다