字节序学习
转自:https://cloud.tencent.com/developer/article/1176183
1.介绍
字节序,指字节在内存中存储的顺序。 如一个int32_t类型的数值占用4个字节,这4个字节在内存中的排列顺序就是字节序。字节序有两种:
1)小端字节序(Little endinan),数值低位存储在内存的低地址,高位存储在内存的高地址;
2)大端字节序(Big endian),数值高位存储在内存的低地址,低位存储在内存的高地址。
以16进制数0x12345678为例(数值左边是高位,右边是低位),大端和小端:
- 主机字节序,即CPU存储数据时采用的字节顺序。分为两大派系,PowerPC系列采用big endian方式存储数据,而x86与x86_64系列则采用little endian方式存储数据。平常大多数PC与服务器如果使用的是Intel与AMD CPU,一般都是little endian。
// //@ret:返回0小端字节序,返回1大端字节序 // int dGetHostByteOrder() { uint32_t a = 0x12345678; uint8_t *p = (uint8_t *)(&a); if(*p==0x78) { return 0; } else { return 1; } }
- 网络字节序,是TCP/IP中规定好的一种数据表示格式,它与具体的CPU类型、操作系统等无关,从而可以保证数据在不同主机之间传输时能够被正确解释。网络字节顺序采用big endian排序方式。
socket网络编程中,有4个标准库函数做转换:
#include <arpa/inet.h> uint32_t htonl(uint32_t hostlong); //把uint32_t类型从主机序转换到网络序 uint16_t htons(uint16_t hostshort); //把uint16_t类型从主机序转换到网络序 uint32_t ntohl(uint32_t netlong); //把uint32_t类型从网络序转换到主机序 uint16_t ntohs(uint16_t netshort); //把uint16_t类型从网络序转换到主机序
//但如果是64位的,需要写函数,好复杂,看不懂。3种方式:移位、联合体union、编译器内置函数。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 地球OL攻略 —— 某应届生求职总结
· 提示词工程——AI应用必不可少的技术
· 字符编码:从基础到乱码解决
· Open-Sora 2.0 重磅开源!
2020-01-01 1.1学习记录|1.2日学习记录|1.3日