大端法與小端法

小端法(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

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章