字节序

每次看字节序都晕晕的,今天稍微整理下,将理解整理如下

 

内存地址 从左到右  从低地址到高地址

整数大小  从左到右 从高位到低位

 

大端序:高位字节放在低地址,所以其在内存中的顺序就如同书写顺序一样

小端序:高位字节放在高地址,低位字节放在低地址,和人脑的思维顺序是一样的,但是呈现出来就是颠倒顺序

 

举例如下:整数0x1234abcd,放在内存中的顺序

 

              0x0000    0x0001     0x0002   0x0003

大端序      12             34             ab         cd

小端序      cd             ab             34         12

 

举例:在x86机器上,运行一下代码,其结果为

typedef union Interger
{
    unsigned int a;
    unsigned char arrayChar[4];
}Interger_A;

 

int main()

{

    Interger_A IntA;
    IntA.arrayChar[0]=0x12;
    IntA.arrayChar[1]=0x34;
    IntA.arrayChar[2]=0x56;
    IntA.arrayChar[3]=0x78;

    printf("0x%08lx", IntA.a);

}

 

结果为:0x78563412

SDL(Simple DirectMedia Layer)本身并没有直接提供专门处理字节序的高级抽象,但在涉及跨平台数据传输时,字节序是一个重要的问题。字节序分为大端字节序(Big-Endian)和小端字节序(Little-Endian),不同的计算机系统可能采用不同的字节序。 在SDL的开发中,当需要在不同字节序的系统之间传输数据时,就需要进行字节序的转换。例如,在网络传输中,通常采用网络字节序大端字节序),如果本地系统是小端字节序,就需要将数据从本地字节序转换为网络字节序,接收数据时再进行相反的转换。 以下是一个简单的示例,展示了如何进行字节序转换: ```cpp #include <SDL.h> #include <arpa/inet.h> // 包含字节序转换函数 // 假设要传输一个32位整数 Uint32 localValue = 0x12345678; // 转换为网络字节序 Uint32 networkValue = htonl(localValue); // 接收数据后,转换回本地字节序 Uint32 receivedValue = ntohl(networkValue); ``` 在这个示例中,`htonl()` 函数用于将32位整数从本地字节序转换为网络字节序,`ntohl()` 函数用于将32位整数从网络字节序转换回本地字节序。 对于SDL结构体的列化和反列化,如果结构体中包含整数类型的成员,在跨平台传输时也需要进行字节序转换。以 `SDL_Rect` 结构体为例: ```cpp #include <SDL.h> #include <arpa/inet.h> // 列化 SDL_Rect 结构体,进行字节序转换 void serializeSDL_Rect(SDL_Rect& rect, char* buffer) { Uint32 x = htonl(rect.x); Uint32 y = htonl(rect.y); Uint32 w = htonl(rect.w); Uint32 h = htonl(rect.h); std::memcpy(buffer, &x, sizeof(x)); buffer += sizeof(x); std::memcpy(buffer, &y, sizeof(y)); buffer += sizeof(y); std::memcpy(buffer, &w, sizeof(w)); buffer += sizeof(w); std::memcpy(buffer, &h, sizeof(h)); } // 反列化 SDL_Rect 结构体,进行字节序转换 void deserializeSDL_Rect(SDL_Rect& rect, const char* buffer) { Uint32 x, y, w, h; std::memcpy(&x, buffer, sizeof(x)); buffer += sizeof(x); std::memcpy(&y, buffer, sizeof(y)); buffer += sizeof(y); std::memcpy(&w, buffer, sizeof(w)); buffer += sizeof(w); std::memcpy(&h, buffer, sizeof(h)); rect.x = ntohl(x); rect.y = ntohl(y); rect.w = ntohl(w); rect.h = ntohl(h); } ```
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值