endian 변환 모듈

주말에 서버를 개발하다가 아래와 같은 메서드가 없어서 고민을 하다가 만들어 버렸다.

uint32_t htonl(uint32_t hostlong);

uint32_t ntohl(uint32_t netlong);

D language에서는 위와 같은 메서드를 찾아볼수 없고, 유저 게시판에서도 못찾아서 만들어 버렸는데, 꽤 쓸만하다.

네트워크상에서는 Big-endian을 쓰니 LittleEndian에서만 문제가 생기더라. 그래서 아래와 같은 모듈로 두 메서드를 대체해 버렸다.

[CODE c]
import std.system;

uint htonl(uint hostlong){
    ubyte[4] retbyte;
   
    // 현재의 머신이 리틀엔디언이라면
    if(endian == Endian.LittleEndian){
        // little -> big
        retbyte[length – 4] = hostlong >> 24;
        retbyte[length – 3] = hostlong >> 16;
        retbyte[length – 2] = hostlong >> 8;
        retbyte[length – 1] = hostlong;
        //retbyte를 uint*로 캐스팅, 레퍼런스값을 취한다.
        return *cast(uint*)&retbyte[0];
    }else return hostlong;
}

alias htonl ntohl; // ntohl는 htonl와 같은 내용의 함수이다.

[/CODE]

CC BY-NC 4.0 endian 변환 모듈 by from __future__ import dream is licensed under a Creative Commons Attribution-NonCommercial 4.0 International License.

이 글은 개발 카테고리에 분류되었고 태그가 있으며 고감자님에 의해 작성되었습니다. 고유주소 북마크.