본문 바로가기

3.구현/보안

c++를 이용한 byte order 변환

간단한 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;
}

첨부 소스파일

endian.h

반응형

'3.구현 > 보안' 카테고리의 다른 글

Socket에서 비동기 connect 처리하기  (0) 2009.09.21
ARP Protocol  (2) 2009.06.02