linux主机序与网络序的转换

13 篇文章 0 订阅

在网络通信中,经常用到字节序转换,实际上内核已经帮我们实现了两套通用的转序宏定义,但是在转换过程中,都是进行主继续与网络序的转换,代码难免冗余,我们可以根据已经提供的特性,来添加一些执行规则,这样就可以用一个转序函数实现两种转序,例如,htonl,既可以实现原htonl的功能,也实现了ntohl的功能,不用写两套转换函数,只需要将转序函数重新定义一个名字就可以。定义如下,未实测。

实现的规则就是主机序是大字节序的不转换字节序,保持原序,主机序是小字节序的转为网络序,即大字节序。

#ifndef _MY_BYTE_SWAP_H_
#define _MY_BYTE_SWAP_H_

#ifdef __cplusplus             //告诉编译器,这部分代码按C语言的格式进行编译,而不是C++的
extern "C"{
#endif

#ifdef __KERNEL_
#ifndef _ASM_BYTEORDER_H
#include <asm/byteorder.h>
#endif

#define htonl(x) __htonl(x)
#define ntohl(x) __ntohl(x)
#define htons(x) __htons(x)
#define ntohs(x) __ntohs(x)

#define ntoh64(x) __be64_to_cpu(x)  /* 内核根据CPU实现 */
#define hton64(x) __cpu_to_be64(x)

#else   /*NOT KERNEL */
#ifndef _ENDIAN_H
#include<endian.h>
#endif
#ifndef _BYTESWAP_H
#include <byteswap.h>
#endif
#if (__BYTE_ORDER == __LITTLE_ENDIAN)
#define ntohs(x)    __bswap_16(x)
#define htons(x)    __bswap_16(x)
#define htonl(x)    __bswap_32(x)
#define ntohl(x)    __bswap_32(x)
#define ntoh64(x)   __bswap_64(x)
#define hton64(x)   __bswap_64(x)
#else
#define ntohs(x)    x
#define htons(x)    x
#define htonl(x)    x
#define ntohl(x)    x
#define ntoh64(x)   x
#define hton64(x)   x
#endif
#endif






#ifdef __cplusplus
}
#endif

#endif/* _MY_BYTE_SWAP_H_ */



 

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值