您的位置:首页 > 运维架构 > Linux

htons htonl

2014-06-04 11:00 387 查看
#define htons(x) ___htons(x)
#define ___htons(x) __cpu_to_be16(x)

#define __force	__attribute__((force))
typedef unsigned short __u16;
typedef __u16 __bitwise __be16;

#define __cpu_to_be16(x) ((__force __be16)__swab16((x)))//little_endian
#define __cpu_to_be16(x) ((__force __be16)(__u16)(x))//big_endian

#define __swab16(x)				\
(__builtin_constant_p((__u16)(x)) ?	\
___constant_swab16(x) :			\
__fswab16(x))

/*
__builtin_constant_p(x)
如果x的值在编译时能确定,那么该函数返回值为1.
*/

static inline __attribute_const__ __u16 __fswab16(__u16 val)
{
#ifdef __arch_swab16
return __arch_swab16(val);
#else
return ___constant_swab16(val);
#endif
}

#define ___constant_swab16(x) ((__u16)(				\
(((__u16)(x) & (__u16)0x00ffU) << 8) |			\
(((__u16)(x) & (__u16)0xff00U) >> 8)))

htonl与此类似,它最终调用下面的宏定义

#define ___constant_swab32(x) ((__u32)(				\
(((__u32)(x) & (__u32)0x000000ffUL) << 24) |		\
(((__u32)(x) & (__u32)0x0000ff00UL) <<  8) |		\
(((__u32)(x) & (__u32)0x00ff0000UL) >>  8) |		\
(((__u32)(x) & (__u32)0xff000000UL) >> 24)))
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  linux arm htons htonl