大小端系统分析

什么是大端小端

大小端模式就是存储数据时,数据的高低位是怎么存储在地址的高低位上。
大端模式(Most Significant Byte,MSB):数据的高位,存放在地址的低位,即高位存低位,低位存高位。
小端模式(Least Significant Byte,LSB):数据的高位,存放在地址的高位,即高位存高位,低位存低位。
明显小端模式更符合我们日常记录书写的习惯,pc机一般都是小端模式。
当我们使用的pc机和待读取数据大小端不一致时候,要特别注意,要使用相应的方式进行读取数据,具体方式看下文。

//联合体判断
#include<stdio.h>  
union var{   
        int i; 
        char j; 
}data;  

int main(){  
    data.i = 1;
    if(j == 1)
    {
        printf("pc is 小端\n");
    }
    else
    {
        printf("pc is 大端\n");
    }
}  
//大小端转换
//网络字节序通常是打断,x86pc通常是小段
//如何实现大小端的数据转换。
htons(port);//端口通常为uint16
std:string IP;
inet_addr(IP.c_str());//将点分十进制转换为uint32,再调换字节序
//定义宏:
typedef unsigned int uint_32 ;  
typedef unsigned short uint_16 ;  
//大小端转换16位:
#define BSWAP_16(x) \   
    (uint_16)((((uint_16)(x) & 0x00ff) << 8) | \  
              (((uint_16)(x) & 0xff00) >> 8) \  
             )  
//大小端转换32位:
#define BSWAP_32(x) \   
    (uint_32)((((uint_32)(x) & 0xff000000) >> 24) | \  
              (((uint_32)(x) & 0x00ff0000) >> 8) | \  
              (((uint_32)(x) & 0x0000ff00) << 8) | \  
              (((uint_32)(x) & 0x000000ff) << 24) \  
             )  
//定义函数:
//大小端转换16位:
uint_16 bswap_16(uint_16 x)
{
    return (((uint_16)(x) & 0x00ff) << 8) | \
           (((uint_16)(x) & 0xff00) >> 8) ;
}
//大小端转换32位
uint_32 bswap_32(uint_32 x)  
{  
    return (((uint_32)(x) & 0xff000000) >> 24) | \  
           (((uint_32)(x) & 0x00ff0000) >> 8) | \  
           (((uint_32)(x) & 0x0000ff00) << 8) | \  
           (((uint_32)(x) & 0x000000ff) << 24) ;  
}  



©️2020 CSDN 皮肤主题: 像素格子 设计师:CSDN官方博客 返回首页