字节序(Byte Order)
是指多字节数据类型(如16位、32位或64位的整数)在计算机系统中存储时,字节是如何排列的。计算机内存是以字节为单位的,而一个字节是8位(bit)。当处理大于一个字节的数据时,不同的硬件架构可能会以不同的方式存储这些字节。
主要存在两种字节序:
- 小端字节序(Little Endian):在小端模式下,最低有效字节(即二进制表示中的最低位所在的字节)被存储在内存的最低地址处,最高有效字节则存储在内存的最高地址处
- 大端字节序(Big Endian):与小端相反,在大端模式下,最高有效字节存储在内存的最低地址处,最低有效字节则存储在内存的最高地址处。
测试大小端
方法一:
使用共用体。共用体使用的为同一块内存,可以理由这个特性来测试存储的是高字节还是低字节
#include <stdio.h>
#include <arpa/inet.h>
int main(int argc, char const *argv[])
{
union un
{
int b;
char c;
}a;
a.b = 0x12345678;
printf("%#x\n",a.c);
return 0;
}
放大二:
指针强转
#include <stdio.h>
#include <arpa/inet.h>
int main(int argc, char const *argv[])
{
int a = 0x12345678;
char*p = (char *)&a;
printf("%#x\n",*p);
//host to net long 将主机字节序转为网络字节序
int ch = htonl(a);
char*p2 = (char *)&ch;
printf("%#x\n",*p2);
return 0;
}
输出结果
char类型长度为一个字节,强制转换后是低字节0x78,所以主机为低字节序
总结
计算机网络通信中,一般情况下,电脑端是低字节序,网络端为高字节序。
为了处理字节序的问题,编程语言和库提供了转换函数,比如C语言中的ntohs()、htons()、ntohl()、htonl()等函数用于在主机字节序和网络字节序之间转换。