大小端模式

文章目录

    • 一、概念
    • 二、举例
    • 三、判大小端和交换

一、概念

  1. 大端模式(Big-endian),是一种数据存储方式,其中较高的字节(最高有效字节)存储在较低的内存地址,较低的字节(最低有效字节)存储在较高的内存地址。

  2. 小端模式(Little-endian),在小端模式下,较低的字节存储在较低的内存地址,较高的字节存储在较高的内存地址。

  3. 总结为:

    • 大端:高位放数低
    • 小端:低位放数低

二、举例

  1. 假设存32bit的数据0x13141990,该数据左边为高字节,右边为低字节,即左高右低。把此数据存到内存地址为0x3000-0x3003的寄存器内。
  2. 大端模式存储为:
    大小端模式_第1张图片
  3. 小端模式存储为:
    大小端模式_第2张图片

三、判大小端和交换

  1. 判断大小端
    • 观察内存中的多字节数据存储方式:可以创建一个整数变量,例如值为0x12345678的变量x,并对其进行内存地址访问。然后检查该变量在内存中的存储方式。如果x在内存中的地址从小到大依次存储的是12、34、56、78(大端序),则系统使用大端序。如果存储方式是78、56、34、12(小端序),则系统使用小端序。
    • 使用联合体(Union)判断字节序: 可以使用联合体来检查字节序。联合体是一种特殊的数据结构,允许多个不同类型的成员共享同一块内存空间。我们可以定义一个联合体,其中包含一个整型变量和一个字符数组,然后将整数赋值为某个已知的值(例如0x12345678),最后检查字节数组中存储的顺序。如果字节数组的排列次序与大端序相同,则系统为大端序;如果字节数组的排列次序与小端序相同,则系统为小端序。
    • 也可以不使用联合体。在内存中创建一个带有值的多字节整数变量,然后使用指针将该变量的地址转换为单个字节的指针。然后检查指向的内存中的第一个字节的值。如果该值与预期的字节顺序相同,则是大端字节序。如果与预期的字节顺序相反,则是小端字节序。
//联合体
#include 

union EndianCheck {
    int value;
    char bytes[sizeof(int)];
};

int main() {
    EndianCheck check;
    check.value = 0x12345678;

    if (check.bytes[0] == 0x12) {
        std::cout << "Big Endian" << std::endl;
    } else if (check.bytes[0] == 0x78) {
        std::cout << "Little Endian" << std::endl;
    } else {
        std::cout << "Unknown Endian" << std::endl;
    }

    return 0;
}

//非联合体
int num = 0x0001;
char* ptr = (char*)&num;
if (*ptr == 0x00) {
    // 大端字节序
} else {
    // 小端字节序
}
  1. 将一个32位无符号整数(nValue)的字节顺序进行翻转,目的变成大端序。这种字节顺序翻转的操作常用于处理网络传输中的字节序问题,或者在不同系统间进行数据交换时,确保数据的正确解析和处理。
//nValue传进来的值
unsigned int Swap( unsigned int nValue )
{
	//如果为小端序,则进行如下操作
	if( ENDIANNESS == 'l' )
		return (unsigned int)( 0 | ( nValue & 0x000000ff ) << 24 
								 | ( nValue & 0x0000ff00 ) << 8 
								 | ( nValue & 0x00ff0000 ) >> 8
								 | ( nValue & 0xff000000 ) >> 24 );
	else
		//大端序则直接返回
		return nValue;
}

你可能感兴趣的:(C++,开发语言,c++)