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
- C++->大小端转换
- C语言:大小端转换
- C/C++ 大小端理解及转换
- 写一个C宏,实现大小端之间的转换
- [c/c++ ]字节序与大小端转换
- SP5000系列烧录器大小端转换C语言实现
- C语言二进制文件读写以及大小端转换
- c/c++ int,float,short 大小端转换函数
- 大小端数据转换
- 大小端转换
- 大小端转换
- 大小端互相转换
- 大小端转换
- 大小端转换
- 大小端转换
- socket大小端转换
- 大小端数据转换
- 大小端转换
- 3.迭代器和仿函数
- String与StringBuffer的区别
- jboss之后台管理路径
- 《写给大家看的设计书》读后
- 人工误删除InnoDB ibdata数据文件如何恢复?(没试过)
- C++->大小端转换
- Cocos2d-x环境搭建问题,Visual studio 2012与Visual studio 2013运行项目出现的错误
- java读取EXCEL文件1
- 图像匹配之归一化积相关灰度匹配
- Git的使用说明
- 学习Window API打印正弦函数
- 电子设计省赛--SPWM(死区时间)
- Mysql_innodb与myisam中存储方式的区别
- java读取EXCEL 2