字节序

字节序包括高字节序和低字节序,那么什么是高字节序呢?什么又是低字节序呢?

例如:0x01020304;

低字节-------1----------2------------3------------4---->高字节

-------------01--------02-----------03-----------04---------------

高字节序就是:

 

低地址--------------------------------------------->高地址

-------01------ 02 --------03 ---------04

低字节序就是:

 

低地址------------------------------------------>高地址

---------04--------03--------------02-------------01-------

通常我们见到的字节序有如下:

主机字节序

网络字节序

JAVA字节序

其中网络字节序和JAVA字节序都是高字节序,至于主机需要根据实际情况而定,可以进行测试

#include <stdio.h>
#include <stdlib.h>

int main(int argc, char *argv[])
{
  union UA{
    unsigned short a;
    unsigned char b[2];   
    } ub;
    ub.a=0x0102;
    printf("%d,%d,%x,%x",ub.b[0],ub.b[1],&ub.b[0],&ub.b[1]);
  system("PAUSE");   
  return 0;
}

输出1,2就是高字节序;2,1就是低字节序

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、付费专栏及课程。

余额充值