首页 > 其他分享 >字节序转换

字节序转换

时间:2023-04-23 11:24:57浏览次数:27  
标签:__ return 字节 val bytes swap inline 转换

#include <boost/detail/endian.hpp>
#include <boost/static_assert.hpp>
#include <boost/type_traits.hpp>
#include <stdexcept>

// Little-endian operating systems:
//---------------------------------
// Linux on x86, x64, Alpha and Itanium
// Mac OS on x86, x64
// Solaris on x86, x64, PowerPC
// Tru64 on Alpha
// Windows on x86, x64 and Itanium

// Big-endian operating systems:
//------------------------------
// AIX on POWER
// AmigaOS on PowerPC and 680x0
// HP-UX on Itanium and PA-RISC
// Linux on MIPS, SPARC, PA-RISC, POWER, PowerPC, and 680x0
// Mac OS on PowerPC and 680x0
// Solaris on SPARC

enum endianness {
  little_endian,
  big_endian,
  network_endian = big_endian,

#if defined(BOOST_LITTLE_ENDIAN)
  host_endian = little_endian
#elif defined(BOOST_BIG_ENDIAN)
  host_endian = big_endian
#else
#error "unable to determine system endianness"
#endif
};

namespace detail {

template <typename T, size_t sz>
struct swap_bytes {
  inline T operator()(T val) { throw std::out_of_range("data size"); }
};

template <typename T>
struct swap_bytes<T, 1> {
  inline T operator()(T val) { return val; }
};

template <typename T>
struct swap_bytes<T, 2>  // for 16 bit
{
  inline T operator()(T val) {
    return ((((val) >> 8) & 0xff) | (((val)&0xff) << 8));
  }
};

template <typename T>
struct swap_bytes<T, 4>  // for 32 bit
{
  inline T operator()(T val) {
#if defined(_USE_BUILTIN_BSWAPS) && defined(__GNUC__) && \
    ((__GNUC__ == 4 && __GNUC_MINOR__ >= 3) || __GNUC__ > 4)
    return __builtin_bswap32(val);
#else
    return ((((val)&0xff000000) >> 24) | (((val)&0x00ff0000) >> 8) |
            (((val)&0x0000ff00) << 8) | (((val)&0x000000ff) << 24));
#endif
  }
};

template <>
struct swap_bytes<float, 4> {
  inline float operator()(float val) {
    uint32_t mem = swap_bytes<uint32_t, sizeof(uint32_t)>()(*(uint32_t*)&val);
    return *(float*)&mem;
  }
};

template <typename T>
struct swap_bytes<T, 8>  // for 64 bit
{
  inline T operator()(T val) {
#if defined(_USE_BUILTIN_BSWAPS) && defined(__GNUC__) && \
    ((__GNUC__ == 4 && __GNUC_MINOR__ >= 3) || __GNUC__ > 4)
    return __builtin_bswap64(val);
#else
    return ((((val)&0xff00000000000000ull) >> 56) |
            (((val)&0x00ff000000000000ull) >> 40) |
            (((val)&0x0000ff0000000000ull) >> 24) |
            (((val)&0x000000ff00000000ull) >> 8) |
            (((val)&0x00000000ff000000ull) << 8) |
            (((val)&0x0000000000ff0000ull) << 24) |
            (((val)&0x000000000000ff00ull) << 40) |
            (((val)&0x00000000000000ffull) << 56));
#endif
  }
};

template <>
struct swap_bytes<double, 8> {
  inline double operator()(double val) {
    uint64_t mem = swap_bytes<uint64_t, sizeof(uint64_t)>()(*(uint64_t*)&val);
    return *(double*)&mem;
  }
};

template <endianness from, endianness to, class T>
struct do_byte_swap {
  inline T operator()(T value) { return swap_bytes<T, sizeof(T)>()(value); }
};

// specialisations when attempting to swap to the same endianess
template <class T>
struct do_byte_swap<little_endian, little_endian, T> {
  inline T operator()(T value) { return value; }
};

template <class T>
struct do_byte_swap<big_endian, big_endian, T> {
  inline T operator()(T value) { return value; }
};

}  // namespace detail

template <endianness from, endianness to, class T>
inline T byte_swap(T value) {
  // ensure the data is only 1, 2, 4 or 8 bytes
  BOOST_STATIC_ASSERT(sizeof(T) == 1 || sizeof(T) == 2 || sizeof(T) == 4 ||
                      sizeof(T) == 8);
  // ensure we're only swapping arithmetic types
  BOOST_STATIC_ASSERT(boost::is_arithmetic<T>::value);

  return detail::do_byte_swap<from, to, T>()(value);
}

标签:__,return,字节,val,bytes,swap,inline,转换
From: https://www.cnblogs.com/sunwenqi/p/17345916.html

相关文章

  • Unicode编码与中文的转换
    1.1. 将unicode编码转换为中文publicStringdecodeUnicode(Stringsrc){char[]in=src.toCharArray();charaChar;char[]out=newchar[src.length()];intoutLen=0;intoff=0;intend=src.length();whil......
  • Json字符串转换为java对象
    1.  Json字符串转换为java对象1.1. Json字符串转换为javabeanJson2Bean.javapackagejackson;importjava.io.IOException;importorg.codehaus.jackson.map.ObjectMapper;publicclassJson2Bean{publicstaticvoidmain(String[]args)throwsIOExcepti......
  • 宽带( Mb/s ) GB/s, Gb/s, MB/s, Mb/s, KB/s, Kb/s 之间的转换
    Mb/s是我们拉宽带时候说的几兆2M(2Mb/s)ps的意思是每秒/s的意思也是每秒,不通的表现手法,p指per的缩写。意为每秒。所以Mbps就是Mb/s。5Gb/s734471KB/s=5738Mb/s=5.6Gb/s在计算机科学中,bit是表示信息的最小单位,叫做二进制;一般用0和1表示。Byte字节,由8个位(8bit)组成一个字节(1......
  • 从栈帧看字节码是如何在JVM中进行流转的
    从栈帧看字节码是如何在JVM中进行流转的我们都知道java文件需要编译成class文件,然后jvm负责加载并运行class文件,那么字节码文件长什么样子?字节码又是怎么执行的?工具介绍javapjavap是JDK自带的查看字节码的工具。javap的使用方法如下:$javacDemo.java$javap-p-vDemojavap命令......
  • time&datetime&string相互转换
    time&datetime&string相互转换importdatetimeimporttime#日期时间字符串st="2017-11-2316:10:10"#当前日期时间dt=datetime.datetime.now()#当前时间戳sp=time.time()#1.把datetime转成字符串defdatetime_toString(dt):print("1.把datetime转成......
  • bash shell下最方便的字符串大小写转换方法
     用tr需要新增变量,用declare或typeset需要在变量赋值前或者赋值后单独声明,都有些麻烦此方法为bash4.0以后新增,bash4.02009年发布$test="abcDEF"#把变量中的第一个字符换成大写$echo${test^}AbcDEF#把变量中的所有小写字母,全部替换为大写$echo${test^^}ABCDEF#......
  • NAT(网络地址转换)
        NAT是将私有IP地址通过边界路由转换成外网IP地址,在边界路由的NAT地址转换表记录下这个转换映射记录,当外部数据返回时,路由使用NAT技术查询NAT转换表,再将目标地址替换成内网用户IP地址。1.静态NAT(basic基本NAT)    静态NAT就是一对一映射,内部有多少私有地址需要......
  • 线程状态转换
    新建(New)创建后尚未启动。可运行(Runnable)可能正在运行,也可能正在等待CPU时间片。包含了操作系统线程状态中的Running和Ready。阻塞(Blocking)等待获取一个排它锁,如果其线程释放了锁就会结束此状态。无限期等待(Waiting)等待其它线程显式地唤醒,否则不会被分配CPU......
  • Forest-声明式HTTP客户端框架-集成到SpringBoot实现调用第三方restful api并实现接口
    场景Forest声明式HTTP客户端API框架,让Java发送HTTP/HTTPS请求不再难。它比OkHttp和HttpClient更高层,是封装调用第三方restfulapiclient接口的好帮手,是retrofit和feign之外另一个选择。通过在接口上声明注解的方式配置HTTP请求接口。官网:Forest 代码地址:forest:声明式HTTP客户......
  • 类型转换
    类型转换低---------------------------------------------------->高byte,short,char->int->long->float->double强制类型转换高-->低inti=128;bytej=(byte)i;自动类型转换低-->高inti=128;doublej=i;注意不能对布尔值进行转换不能把对象类型转换为不......