C++->大小端转换

来源:互联网 发布:手机限制安装软件 编辑:程序博客网 时间:2024/06/10 04:28

在网络编程中,大小端转换是经常的事。而Linux也有封装好的大小端转换的处理。


可能通过以下步骤来找到linux下的大小端转换是怎么操作的。

在终端下运行以下命令找到linux系统中的endian.h的位置。

locate endian.h

以下是我的电脑找出的结果。


用vim(或者其他编辑器)打开第一个endian.h,可以看到endian.h文件很简单。里面包含了一个<bits/byteswap.h>的头文件。而下是一些宏定义。如果你做过linux下的网络编程,可能会觉得这些宏有点眼熟。


再用locate找到byteswap.h的位置。


在我的计算机中是下面那条记录。再打开这个文件。

可以发现,这个文件也很简单,他的处理都是使用宏来进行转换。宏有什么缺点,大家都知道了。C++的思想是推荐大家使用inline函数来替换宏。这里我对这些宏封装成了函数。以下是主要的代码。

16位的转换:

template <typename T16>T16 Endian::swap16(const T16 &v){assert(sizeof(T16) == 2);return ((v & 0xff) << 8) | (v >> 8);}

32位的转换:

template <typename T32>T32 Endian::swap32(const T32 &v){assert(sizeof(T32) == 4);return (v >> 24)| ((v & 0x00ff0000) >> 8)| ((v & 0x0000ff00) << 8)| (v << 24);}

64位的转换:

template <typename T64>T64 Endian::swap64(const T64 &v){assert(sizeof(T64) == 8);return (v >> 56)| ((v & 0x00ff000000000000) >> 40)| ((v & 0x0000ff0000000000) >> 24)| ((v & 0x000000ff00000000) >> 8)| ((v & 0x00000000ff000000) << 8)| ((v & 0x0000000000ff0000) << 24)| ((v & 0x000000000000ff00) << 40)| (v << 56);}

更多位的转换:

template <typename T>T Endian::swap(const T &v){T r;int size = sizeof(v);const unsigned char *cvi = (const unsigned char*)&v;unsigned char *cri = (unsigned char*)&r;cri = cri + size -1;for (int i = 0; i < size; ++i){*cri = *cvi;++cvi;--cri;}return r;}

上面这个转换的效率会比较差,可以转换任意多位的转换。


源代码:https://github.com/tenghui0425/Common/blob/master/detail/endianex.hpp


转换请注明出处:http://blog.csdn.net/tenghui0425/article/details/23924291


0 0
原创粉丝点击