none
소켓통시할때 빅앤디안 리틀앤디안 설정 어떻게하나요? RRS feed

  • 질문

  • WORD txt = 0x1122;

    WriteFile를 해서 보내개 되면

    받는쪽에서 확인해보니깐

    2211로 거꾸로 받아집니다 ㅠㅠ

    이거 1122로 받게 못하나요?

    2017년 3월 15일 수요일 오전 8:27

모든 응답

  • 아래 두 함수를 참조해보세요~

    htons,l은 호스트 Byte order로 된 자료형(short, long)을 네트워크 Byte order로 바꿔주고,
    ntohs,l은 네트워크 Byte order로 된 자료형을(short, long)을 호스트 Byte order로 바꿔주는 역할을 합니다.

    htons, htonl
    ntohs, ntohl

    2017년 3월 16일 목요일 오후 11:36
  • #pragma once
    #include <stdlib.h>
    #include <type_traits>
    
    template <typename Type, int Size, bool = std::is_integral<Type>::value>
    struct _ConvertEndianImpl
    {
    	static Type Convert(const Type& data)
    	{
    		static_assert(false, "Data size must be between 2 and 8.");
    		return data;
    	}
    };
    
    template <typename Type>
    struct _ConvertEndianImpl<Type, 1, true>
    {
    	static Type Convert(const Type& data)
    	{
    		return data;
    	}
    };
    
    template <typename Type>
    struct _ConvertEndianImpl<Type, 1, false>
    {
    	static Type Convert(const Type& data)
    	{
    		return data;
    	}
    };
    
    template <typename Type>
    struct _ConvertEndianImpl<Type, 2, true>
    {
    	static Type Convert(const Type& data)
    	{
    		return static_cast<Type>(_byteswap_ushort(static_cast<unsigned short>(data)));
    	}
    };
    
    template <typename Type>
    struct _ConvertEndianImpl<Type, 2, false>
    {
    	union ConversionHelper
    	{
    		unsigned short ui16;
    		Type data;
    	};
    
    	static Type Convert(const Type& data)
    	{
    		ConversionHelper ch;
    		ch.data = data;
    		ch.ui16 = _byteswap_ushort(ch.ui16);
    		return ch.data;
    	}
    };
    
    template <typename Type>
    struct _ConvertEndianImpl<Type, 4, true>
    {
    	static Type Convert(const Type& data)
    	{
    		return static_cast<Type>(_byteswap_ulong(static_cast<unsigned long>(data)));
    	}
    };
    
    template <typename Type>
    struct _ConvertEndianImpl<Type, 4, false>
    {
    	union ConversionHelper
    	{
    		unsigned long ui32;
    		Type data;
    	};
    
    	static Type Convert(const Type& data)
    	{
    		ConversionHelper ch;
    		ch.data = data;
    		ch.ui32 = _byteswap_ulong(ch.ui32);
    		return ch.data;
    	}
    };
    
    template <typename Type>
    struct _ConvertEndianImpl<Type, 8, true>
    {
    	static Type Convert(const Type& data)
    	{
    		return static_cast<Type>(_byteswap_uint64(static_cast<unsigned __int64>(data)));
    	}
    };
    
    template <typename Type>
    struct _ConvertEndianImpl<Type, 8, false>
    {
    	union ConversionHelper
    	{
    		unsigned __int64 ui64;
    		Type data;
    	};
    
    	static Type Convert(const Type& data)
    	{
    		ConversionHelper ch;
    		ch.data = data;
    		ch.ui64 = _byteswap_uint64(ch.ui64);
    		return ch.data;
    	}
    };
    
    template <typename Type>
    Type ConvertEndian(const Type& data)
    {
    	return _ConvertEndianImpl<Type, sizeof(Type)>::Convert(data);
    }
    
    template <typename Type>
    void ReverseEndian(Type& data)
    {
    	data = _ConvertEndianImpl<Type, sizeof(Type)>::Convert(data);
    }

    저는 이렇게 만들어서 사용합니다. 2byte ~ 8byte 크기 상관 없이 동작하며,

    short/int 등의 정수 타입도 뿐만 아니라 float/double 부동소수 타입도 잘 동작합니다.

    WORD txt = 0x1122;
    ReverseEndian(txt);

    또는

    WORD txt = ConvertEndian(0x1122);


    이렇게 사용하시면 됩니다.

    2017년 3월 17일 금요일 오전 12:28