0%

字节序:大端法和小端法

字节序,顾名思义字节的顺序,再多说两句就是大于一个字节类型的数据在内存中的存放顺序(一个字节的数据当然就无需谈顺序的问题了)。

大端法:高位保存在低地址中。
小端法:高位存放在高地址中。



程序判断大端法还是小端法

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
#include <iostream>
using namespace std;

int main()
{
union {
short s;
char c[sizeof(short)];
} u;

u.s = 0x1234;
if (sizeof(short) == 2)
{
if (u.c[0] == 0x12 && u.c[1] == 0x34)
cout << "Big-Endian"<<endl;
else if (u.c[0] == 0x34 && u.c[1] == 0x12)
cout << "Little-Endian"<<endl;
else
cout << "not known"<<endl;
}
else
{
cout << "sizeof(short) ="<< sizeof(short) << endl;
}
return 0;
}

大端和小端法对程序的影响

  • 字节序不是由操作系统决定,而是由cpu架构决定的,比如 x86 的是小端序,而 PPC (PowerPC) 是big endian。 所以跑在 x86 上的 linux/windows 都是小端,而跑在 PPC 上的linux则是大端。

  • 网络字节序为大端。

  • 网络编程中常用的字节序转换函数有如下几个:

1
2
3
4
5
6
7
8
9
10
11
12
13
#include <<netinet/in.h>>

uing16_t htons(uint16_t host16bitvalue);
// 参数为16位主机字节序的值,返回值是16位网络字节序的值

uint32_t htonl(uint32_t host32bitvalue);
// 参数为32位主机字节序的值,返回值是32位网络字节序的值

uint16_t ntohs(uint16_t net16bitvalue);
// 参数为16位网络字节序的值,返回值是16位主机字节序的值

uint32_t ntohl(uint32_t net32bitvalue);
// 参数为16位网络字节序的值,返回值是16位主机字节序的值
喜欢你就打赏一下