본문 바로가기

Research/Web

htonl, htohl for 64bit




// htonl함수가 기본 int밖에 지원하지 않기 때문에 __int64를 지원하는 함수를 찾기 시작~

// htonll에서 나온 값만으로는 정상적으로 동작하는지 알수가 없었음.

// htonll사용해 값 변환 후 ntohll을 사용해서 원래의 값이 나오는지 확인하는 것으로 제대로 동작한다고 판단.

// 여러개의 함수를 써본 결과 아래의 것이 가장 간단하고 제대로 동작한다고 판단해서 이것으로 사용하기로 정함.

 

#include <stdio.h>
#include <WinSock2.h>

#define htonll(x) \
 ((((x) & 0xff00000000000000LL) >> 56) | \
 (((x) & 0x00ff000000000000LL) >> 40) | \
 (((x) & 0x0000ff0000000000LL) >> 24) | \
 (((x) & 0x000000ff00000000LL) >> 8) | \
 (((x) & 0x00000000ff000000LL) << 8) | \
 (((x) & 0x0000000000ff0000LL) << 24) | \
 (((x) & 0x000000000000ff00LL) << 40) | \
 (((x) & 0x00000000000000ffLL) << 56))

#define ntohll(x) \
 ((((x) & 0x00000000000000FF) << 56) | \
 (((x) & 0x000000000000FF00) << 40) | \
 (((x) & 0x0000000000FF0000) << 24) | \
 (((x) & 0x00000000FF000000) << 8)  | \
 (((x) & 0x000000FF00000000) >> 8)  | \
 (((x) & 0x0000FF0000000000) >> 24) | \
 (((x) & 0x00FF000000000000) >> 40) | \
 (((x) & 0xFF00000000000000) >> 56))

int main(void)
{
 int big32 = 0, iVal = 121299;
 __int64 big64 = 0;
 
 printf("iVal = %d\n\n", iVal);
 big32 = htonl(iVal);
 printf("big32[%d]\n",big32);
 big32 = ntohl(big32);
 printf("big32[%d]\n",big32);

 

 big64 = htonll(iVal);
 printf("big64[%I64d]\n",big64);
 big64 = ntohll(big64);
 printf("big64[%I64d]\n",big64);
}




출처 :: http://blog.naver.com/PostView.nhn?blogId=nkein82&logNo=100121777432





'Research > Web' 카테고리의 다른 글

IDS 우회 참고자료  (0) 2014.04.08
snort - Packet Acquisition  (0) 2014.02.14
python socket관련 - socket, urllib2, httplib  (0) 2014.02.13
Suricata 소스 특징정리  (0) 2014.01.13
[ Network ] IPv6.h // ndp.h  (0) 2013.09.10