字节序

由于历史的原因,业界存在两种字节序标准:BigEndian和LittleEndian,Power PC是大头,X86是小头,有些CPU可以通过寄存器设置支持不同的字节序,例如MIPS;

所谓大头就是高位在低字节,低位在高字节;小头则与此相反,以0x345678为例,大头内存从低到高的存放次序为00,34,56,78,小头内存从低到高的存放次序为78,56,34,00;(上面的数值统一为16进制表示形式)

字节序问题广泛存在于设备与设备之间、单板与单板之间、单板与底层芯片之间,只要两个处理单元的字节序不同,这个问题就存在,为了解决不同字节序的处理单元之间的通信问题,业界定义了主机序和网络序的概念,网络序主要用于信息传递,一般不用于计算,其字节顺序与大头一致;

除了在编码时绷紧这根弦以外,我们在器件选择时尽量选择主机序与网络序一致的芯片,同一设备的不同单板使用相同的字节序,并优先选择支持大头的芯片,这样,即使不能彻底解决问题,也可以彻底规避问题。
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); } ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值