zoukankan      html  css  js  c++  java
  • 【转】[c/c++ ]字节序与大小端转换--不错

    原文网址:http://blog.csdn.net/kuai0705/article/details/20841133

    注明: 以下内容均为学习内容整理,记录,便于自己学习,并非完全意义上的自产,如有感到不适,请联系我

    一.多字节值及字节序

     
    1.brief
     
    现在有一个数字 65430,这个数字在二进制的内存中一个字节无法完全存下,存储这个数字需要1个字节以上的空间。这样的值被称为多字节量(multi-byte quantity)。
     
    65430在内存中由两个字节表示:0xFF 和 0x96 ,其中:
    0xFF被称为最高有效字节(most significant byte, MSB) 
    0x96 被称为最低有效字节(last significant byte, LSB)
     
    在内存中存储这样的多字节整数有两种方式
     
    大端:最高有效字节存储在较低的内存位置
    such as:
    0x0->0xFF
    0x1->0x96
    小端:最低有效字节存储在较低的内存位置
    such as:
    0x0->0x96
    0x1->0xFF
     
    2.整数字节序转换
         整个过程从该值的MSB和LSB开始交换,直到交换至该值的中间点,唯一的难点在于,由于不能简单的把对象(结构型数据)转换为字节数组去用单一的通用函数转换字节,所以需要知道哪些字节序需要转换,例如 把内存中的struc或class写入文件时,要正确的转换字节序,便需要知道其中每个数据成员的位置及大小,并基于每个成员的大小逐一进行适当的转换
    [cpp] view plaincopy在CODE上查看代码片派生到我的代码片
     
    1. //对应int32大小的成员 的转换 范例   
    2. int32_t swapInt32(int32_t value)  
    3. {  
    4.      return ((value & 0x000000FF) << 24) |  
    5.                ((value & 0x0000FF00) << 8) |  
    6.                ((value & 0x00FF0000) >> 8) |  
    7.                ((value & 0xFF000000) >> 24) ;  
    8. }  
     
     
    3.浮点数字节序转换
    浮点数的内部结构相对比较复杂,但仍然可以把浮点数当作整数转换字节序,因为字节始终是字节,可以使用c++的reinterpret_cast操作把浮点数诠释为整数,这称为类型双关(type_punning),或者使用一个简便的方法是 使用union
     
    [cpp] view plaincopy在CODE上查看代码片派生到我的代码片
     
    1. union intWithFloat  
    2. {  
    3.      int32_t m_i32;  
    4.      float m_f32;  
    5. }  
    6.   
    7. float swapFloat32(float value)  
    8. {  
    9.      intWithFloat i;  
    10.      i.m_i32 = value;  
    11.      i.m_f32 = swapInt32(i.m_i32)  
    12.      return i.m_f32;  
    13. }   
  • 相关阅读:
    2018.1.10 区块链论文翻译
    2018.1.9 区块链论文翻译
    2019.1.7 区块链论文翻译
    #在蓝懿iOS学习的日子#
    #在蓝懿学习iOSd的日子#
    #在蓝懿iOS学习的日子#2014年10月15日
    #蓝懿iOSi学习的日子#2015年10月14日
    #蓝懿ios学习的日子#2015年 10月13日
    #蓝懿ios学习的日子#2015年10月12鈤
    三种读写XML的方法
  • 原文地址:https://www.cnblogs.com/wi100sh/p/4899419.html
Copyright © 2011-2022 走看看