간단한 Byte Order관련 처리 내용이다. 인터넷 참조하여 심플하게 코드 수정하고 잡다한거 빼버리고, 외부 참조도 제거했다. C++전용이며, 가급적 이식성을 고려하여 작성하였다. short형이 좀 걸리지만.
is_big_endian()은 별도 소스파일로 분리할 수 있지만, 배포를 고려하여 한 파일에 모두 넣어버렸다.
그냥 사용하면 됨.. 우왕굳!!! ^^;
작성:http://ospace.tistory.com/(ospace114@empal.com) 2011.08.11
Version 1.2: 이전(version 1.1)에 심각한 문제가 있어서 수정(endian 바뀜)
코드
/*
Copyleft (C) 2011 ospace114@empal.com
Filename: endian.h
Version: 1.2 (2013.03.14)
Usage:
//Header file
#include "endian.h"
//Sample Code
std::cout << "endian: "
<< (is_big_endian()?"BIG ENDIAN":"LITTLE ENDIAN")
<< std::endl;
int val = 12345;
std::cout << "host to network: " << val << " >> " << HTON(val) << std::endl;
std::cout << "reverse: " << val << " >> " << reverse(val) << std::endl;
*/
#pragma once
#if (BYTE_ORDER == LITTLE_ENDIAN || __BYTE_ORDER == LITTLE_ENDIAN ||\
__BYTE_ORDER == __LITTLE_ENDIAN)
#define NTOH(x) reverse((x))
#define HTON(x) reverse((x))
#else
#if (BYTE_ORDER == BIG_ENDIAN || __BYTE_ORDER == BIG_ENDIAN ||\
__BYTE_ORDER == __BIG_ENDIAN)
#define NTOH(x) (x)
#define HTON(x) (x)
#else
#error "No Support BYTE ORDER."
#endif
#endif
inline
bool is_big_endian()
{
char buf[2] = {0,1};
unsigned short *val = reinterpret_cast<unsigned short*>(buf);
return *val == 1;
}
template <class T>
T reverse(T from)
{
T to;
char *s_from = reinterpret_cast<char*>(&from);
char *s_to = reinterpret_cast<char*>(&to);
for (int i = 0; i < sizeof(T); ++i)
s_to[i] = s_from[ sizeof(T) - i - 1 ];
return to;
}
사용 샘플 코드
#include <iostream>
#include "endian.h"
int main()
{
using std::cout;
using std::endl;
std::cout << "endian: " << (is_big_endian()?"BIG ENDIAN":"LITTLE ENDIAN") << std::endl;
int val = 12345;
std::cout << "host to network: " << val << " >> " << HTON(val) << std::endl;
std::cout << "reverse: " << val << " >> " << reverse(val) << std::endl;
return 0;
}
첨부 소스파일
반응형
'3.구현 > 보안' 카테고리의 다른 글
Socket에서 비동기 connect 처리하기 (0) | 2009.09.21 |
---|---|
ARP Protocol (2) | 2009.06.02 |