주말에 서버를 개발하다가 아래와 같은 메서드가 없어서 고민을 하다가 만들어 버렸다.
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]
endian 변환 모듈 by from __future__ import dream is licensed under a Creative Commons Attribution-NonCommercial 4.0 International License.