htonl函数的功能_求教:谁能提供ntohl htonl 的函数源码

class FoundationAPI ByteOrder

{

public:

enum NATIVE_BYTE_ORDER { BIG_ENDIAN = 0, LITTLE_ENDIAN = 1 };

private:

static const NATIVE_BYTE_ORDER                NativeByteOrder;

public:

static NATIVE_BYTE_ORDER GetLocalByteOrder();

static t_uint16 FlipBytes(t_uint16 val);

static t_int16 FlipBytes(t_int16 val);

static t_uint32 FlipBytes(t_uint32 val);

static t_int32 FlipBytes(t_int32 val);

static t_uint64 FlipBytes(t_uint64 val);

static t_int64 FlipBytes(t_int64 val);

static t_uint16 FromNativeOrderToNetOrder(t_uint16 val);

static t_int16 FromNativeOrderToNetOrder(t_int16 val);

static t_uint32 FromNativeOrderToNetOrder(t_uint32 val);

static t_int32 FromNativeOrderToNetOrder(t_int32 val);

static t_uint64 FromNativeOrderToNetOrder(t_uint64 val);

static t_int64 FromNativeOrderToNetOrder(t_int64 val);

//

static t_uint16 FromNetOrderToNativeOrder(t_uint16 val);

static t_int16 FromNetOrderToNativeOrder(t_int16 val);

static t_uint32 FromNetOrderToNativeOrder(t_uint32 val);

static t_int32 FromNetOrderToNativeOrder(t_int32 val);

static t_uint64 FromNetOrderToNativeOrder(t_uint64 val);

static t_int64 FromNetOrderToNativeOrder(t_int64 val);

};

const ByteOrder::NATIVE_BYTE_ORDER ByteOrder::NativeByteOrder = ByteOrder::GetLocalByteOrder();

ByteOrder::NATIVE_BYTE_ORDER ByteOrder::GetLocalByteOrder ()

{

assert(sizeof(t_uint16) == 2);

union

{

t_uint16 s;

t_byte c[sizeof(t_uint16)];

} un;

un.s = 0x0201;

if ( ( 2 == un.c[0] ) && ( 1 == un.c[1] ) )

{

return BIG_ENDIAN;

}

else if ( ( 1 == un.c[0] ) && ( 2 == un.c[1] ) )

{

return LITTLE_ENDIAN;

}

else

{

assert(false);

throw std::runtime_error("Unknow Byte Order&quot

;

}

}

t_uint16 ByteOrder::FlipBytes(t_uint16 val)

{

return (((val >>

& 0x00FF) | ((val <<

& 0xFF00));

}

t_uint32 ByteOrder::FlipBytes(t_uint32 val)

{

return (

((val >> 24) &0x000000FF)|

((val >>

& 0x0000FF00)|

((val <<

& 0x00FF0000)|

((val << 24) & 0xFF000000)

);

}

t_uint64 ByteOrder::FlipBytes(t_uint64 val)

{

t_uint32 hi = t_uint32( val >> 32);

t_uint32 lo = t_uint32(val  & 0xFFFFFFFF);

t_uint64 fhi = t_uint64(FlipBytes(hi));

t_uint64 flo = t_uint64(FlipBytes(lo));

flo <<= 32;

return (flo | fhi);

}

t_int64 ByteOrder::FlipBytes(t_int64 val)

{

return FlipBytes(t_uint64(val));

}

t_int32 ByteOrder::FlipBytes(t_int32 val)

{

return FlipBytes((t_uint32)val);

}

t_int16 ByteOrder::FlipBytes(t_int16 val)

{

return FlipBytes((t_uint16)val);

}

#define DEFINE_NATIVE_T_NET(type)                                                                                \

type ByteOrder::FromNativeOrderToNetOrder(type val)                                \

{                                                                                                                                \

if(NativeByteOrder != BIG_ENDIAN)                                                \

{                                                                                                                \

val = FlipBytes(val);                                                        \

}                                                                                                                \

return val;                                                                                                \

}                                                                                                                                \

DEFINE_NATIVE_T_NET(t_int16)

DEFINE_NATIVE_T_NET(t_uint16)

DEFINE_NATIVE_T_NET(t_int32)

DEFINE_NATIVE_T_NET(t_uint32)

DEFINE_NATIVE_T_NET(t_int64)

DEFINE_NATIVE_T_NET(t_uint64)

#define DEFINE_NET_T_NATIVE(type)                                                                                \

type ByteOrder::FromNetOrderToNativeOrder(type val)                                \

{                                                                                                                                \

if(NativeByteOrder != BIG_ENDIAN)                                        \

{                                                                                                                \

val = FlipBytes(val);                                                        \

}                                                                                                                \

return val;                                                                                                \

}                                                                                                                                \

DEFINE_NET_T_NATIVE(t_int16)

DEFINE_NET_T_NATIVE(t_uint16)

DEFINE_NET_T_NATIVE(t_int32)

DEFINE_NET_T_NATIVE(t_uint32)

DEFINE_NET_T_NATIVE(t_int64)

DEFINE_NET_T_NATIVE(t_uint64)

以上是我自己的库里的,大概其ntohl也就属于此类东西了

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值