大端格式和小端格式的,高位字节,低位字节

时间:2025-02-24 21:30:23

一。基本概念以及名词分析

1,高位字节与低位字节

对于16进制数,0x10203040,按照常规数字写法,左边为高位,右边为低位,这里同理,高字节位就是10,低位字节就是40,记住左高右低

2.高地址和低地址

谈到了地址,不可避免的提及内存,将一个数据存在内存中,按照地址来分配内存区域,有一定 的规则。地址编小的为低地址。地址编号大的为高地址,地址的增长方向和内存的生长方向有关,如下图示

0x0004高地址
0x0003
0x0002低地址

举个例子 0x0806在内存中按照下面的这种方式存储的 这里的字节序采用的大端格式

1.栈顶底(高地址)

0x06 --低位

0x08 --高位

栈顶 (低地址)

3.大端模式和小端模式仍以0x0806在内存存储方式为例

大端模式

栈顶底(高地址)

0x08 -高位

0x06-低位

栈顶(低地址)

小端模式字节序的规律,字节和地址的对应关系 高字节-高地址 低字节-低地址 小端模式的好处体现在读取更加便利,因为读取时是从低地址开始读取,这样读取的速度更快。

小节

大小端字节是有计算设备的cpu决定的,与系统无关

检测本机的那种模式的字节序可以通过一个小程序判断,观察高低字节位和高低地址 的对应关系,可以判断本机是大端还是小端模式的字节序

#include<>

int main()

{

int i =0x10203040;

char *p =(char *)(&i);

printf("内存地址:%x %x\n",p *p);

printf("内存地址:%x,%x\n",p+1,*(p+1));

printf("内存地址:%x,%x\n",p+2,*(p+2));

printf("内存地址:%x,%x\n",p+3,*(p+3));

小端格式

}

三,如何读取 不同字节序存储模式的数据

我们以一个short int 中以小端模式字节序存储一个值1真值1

二进制:0000 0000 0000 0001

            |-----高位----|-----低位-----|

小端存储:|-低地址-|-高地址-|

                 |-低位-|-高位-|

       0000 0001 0000 0000

写成16进制 0x0100 然而读取时候 0x0100=1x16x16+0=256 c此时 出现的就是大小端字节序存取不一致的问题

可以看出存储模式是小端存储,但是实际上按照大端格式计算,因为习惯上大家按照高位在前,低位在后进行计算的。因此,小端模式存储的值需要处理才能恢复原值,对于不同 的类型需要使用不同的方式恢复原值

int类型在小端字节序

#define BLEndianlong(x) (value=((x& 0x00FF) <<8) | ((x&0xFF00)>>8));

推荐宏定义的方式进行转换,当然也可以使用函数的方式,耗费内存资源多少的问题

int 类型在小端字节序模式存储恢复

#define BLEndianlong(x) (x=((x & 0x000000FF) << 24) | ((x & 0x0000FF00) << 8) | ((x & 0x00FF0000) >> 8) | ((x & 0xFF000000) >> 24));   

typedef union FLOAT_BLSWAP
{
    float f;
    char c[4];
}float_blswap;
float BLEndianFloat(float x)
{
    float_blswap d1,d2;
    = x;
    [0] = [3];
    [1] = [2];
    [2] = [1];
    [3] = [0];
    return ;
}