[카테고리:] 미분류

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


    구분설명예시안전성
    포인터 캐스팅*(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*를 통해 변환 후 송수신해야 함