日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程资源 > 编程问答 >内容正文

编程问答

About Endian

發(fā)布時(shí)間:2023/12/20 编程问答 39 豆豆
生活随笔 收集整理的這篇文章主要介紹了 About Endian 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

我們一般將endian翻譯成“字節(jié)序”,將big endian和little endian稱作“大尾”和“小尾”。
在網(wǎng)絡(luò)編程的時(shí)侯,因?yàn)槎丝谔?hào)要進(jìn)行字節(jié)序列的轉(zhuǎn)換,涉及endian:
Big endian: 當(dāng)存儲(chǔ)一個(gè)超過(guò)一個(gè)字節(jié)的數(shù)據(jù)類型時(shí),將其中的高位放在低地址的地方,低位放在高地址的地方。
Little endian: 于Big endian恰恰相反。
File: include/linux/ip.h

82 struct iphdr {
83 #if defined(__LITTLE_ENDIAN_BITFIELD)
84 __u8 ihl:4,
85 version:4;
86 #elif defined (__BIG_ENDIAN_BITFIELD)
87 __u8 version:4,
88 ihl:4;
89 #else
90 #error "Please fix <asm/byteorder.h>"
91 #endif
92 __u8 tos;
93 __be16 tot_len;
94 __be16 id;
95 __be16 frag_off;
96 __u8 ttl;
97 __u8 protocol;
98 __u16 check;
99 __be32 saddr;
100 __be32 daddr;
101 /*The options start here. */
102 };

當(dāng)看到83-91行的代碼的時(shí)侯,難道在小于自己?jiǎn)挝坏腷it之中也存在endian的問(wèn)題?
當(dāng)需要用多個(gè)字節(jié)來(lái)描述一個(gè)數(shù)據(jù)類型,或者是一個(gè)數(shù)據(jù)結(jié)構(gòu)中包含多個(gè)字段時(shí),各個(gè)字段和存儲(chǔ)區(qū)塊中的地址的映射關(guān)系如下:

?

  • big endian: 存儲(chǔ)的區(qū)塊按照地址從低到高的順序以字節(jié)為單位從左到右排列,劃分字段的時(shí)侯,從左到右依次劃分。
  • little endian: 存儲(chǔ)的區(qū)塊按照地址從高到低的順序以字節(jié)為單位從左到右排列,劃分的時(shí)侯,從右到左依次劃分。

現(xiàn)在簡(jiǎn)單的給大家舉幾個(gè)簡(jiǎn)單的例子:

u_int16_t x = 0x1;
u_int8_t xx[2];
memcpy(xx, x);

在上面的代碼中,最終xx[0]和xx[1]都是什么呢?
答案是不固定的,如果是在big endian的計(jì)算機(jī)上:
應(yīng)用第一條規(guī)則,從xx中從取出兩個(gè)字節(jié)x[0], x[1]。我們知道x[1]的地址肯定比x[0]高,所以排列如下:

x[0] x[1]
---------
15 ... 0
---------
00 01

很明顯x[0] == 0, x[1] == 1.
如果是little endian的計(jì)算機(jī):
應(yīng)用第二條規(guī)則:

x[1] x[0]
---------
15 ... 0
---------
00 01

結(jié)果為x[0] == 1, x[1] == 0.
仔細(xì)看看結(jié)論是不是和在文章開始的判別方法給出的結(jié)論是相同的?所以在一定程度上,我們可以認(rèn)為前一個(gè)結(jié)論是后一個(gè)結(jié)論的推論。
讓我們看個(gè)更加復(fù)雜一點(diǎn)的例子:

union {
u_int16_t num;
struct {
u_int8_t a4 : 4;
u_int8_t b8;
u_int8_t c4 : 4;
} b;
} a;
a.b.a4 = 0x01;
a.b.b8 = 0x0203;
a.b.c4 = 0x04;
a.num = ?
?

這個(gè)是不是復(fù)雜了很多,不要說(shuō)實(shí)際中這樣的應(yīng)用不多,看看Linux內(nèi)核中數(shù)據(jù)結(jié)構(gòu)你就會(huì)明白,類似結(jié)構(gòu)還是蠻多的。
當(dāng)然又是和endian有關(guān)的問(wèn)題,分類分析了:
big endian:

---------------------
| 7-4|3-0 | 7-4|3-0 |
---------------------
| a[0] | a[1] |
---------------------
| a4 | b8 | c4 |
---------------------
| 01 | 02 | 03 | 04 |
---------------------
| 0x01020304 |
---------------------

所以,a.num = 0x01020304
little endian:

---------------------
| 7-4|3-0 | 7-4|3-0 |
---------------------
| a[1] | a[0] |
---------------------
| c4 | b8 | a4 |
---------------------
| 04 | 02 | 03 | 01 |
---------------------
| 0x04020301 |
---------------------

所以,a.num = 0x04020301

總結(jié)

以上是生活随笔為你收集整理的About Endian的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。