小端法(little endian),就是將最低有效字節放在前面
大端法(big endian),就是將最高有效字節放在前面
小端法違反直覺,但是主流操作系統都用這個,平時我們用的都是小端法
大端法符合習慣,用於網絡字節流
需要澄清:
1. 具體字節是順序排列還是倒序排列,是就一個具體的數據內部而言的。也就是說,數據與數據之間永遠都是順序存放,大端小端不會影響數據以外的內容(比如字符對齊產生的多餘空間)
2. 字符串永遠都是順序存放,因此具有更好的跨平臺性
實驗1:
#include <stdio.h>
#include <netinet/in.h>
int main()
{
printf("little endian:\n");
short n = 0x1234;
for(int i = 0; i < sizeof(n); ++i){
printf("%x\n", *((char*)&n + i));
}
printf("big endian:\n");
n = htons(n); // 將一個小端表示的短整型轉爲大端表示
for(int i = 0; i < sizeof(n); ++i){
printf("%x\n", *((char*)&n + i));
}
return 0;
}
結果:
little endian:
34
12
big endian:
12
34
實驗2:
#include <stdio.h>
#include <string.h>
struct node
{
short s;
int n;
} a;
int main()
{
printf("sizeof(node) = %d\n", sizeof(a));
memset(&a, 0, sizeof(a));
a.s = 0x0123;
a.n = 0x01234567;
for(int i = 0; i < sizeof(a); ++i){
printf("%02x\n", *((char*)&a+i));
}
return 0;
}
結果:
sizeof(node) = 8
23
01
00
00
67
45
23
01