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

歡迎訪問 生活随笔!

生活随笔

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

编程问答

java 大端字节序_理解字节序 大端字节序和小端字节序

發(fā)布時(shí)間:2025/3/21 编程问答 29 豆豆
生活随笔 收集整理的這篇文章主要介紹了 java 大端字节序_理解字节序 大端字节序和小端字节序 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

以下內(nèi)容參考了

http://www.ruanyifeng.com/blog/2016/11/byte-order.html

https://blog.csdn.net/yishengzhiai005/article/details/39672529

1.

計(jì)算機(jī)硬件有兩種儲(chǔ)存數(shù)據(jù)的方式:大端字節(jié)序(big endian)和小端字節(jié)序(little endian)。

舉例來說,數(shù)值0x2211使用兩個(gè)字節(jié)儲(chǔ)存:高位字節(jié)是0x22,低位字節(jié)是0x11。

大端字節(jié)序:高位字節(jié)在前,低位字節(jié)在后,這是人類讀寫數(shù)值的方法。

小端字節(jié)序:低位字節(jié)在前,高位字節(jié)在后,即以0x1122形式儲(chǔ)存。

同理,0x1234567的大端字節(jié)序和小端字節(jié)序的寫法如下圖。

2.

我一直不理解,為什么要有字節(jié)序,每次讀寫都要區(qū)分,多麻煩!統(tǒng)一使用大端字節(jié)序,不是更方便嗎?

上周,我讀到了一篇文章,解答了所有的疑問。而且,我發(fā)現(xiàn)原來的理解是錯(cuò)的,字節(jié)序其實(shí)很簡(jiǎn)單。

3.

首先,為什么會(huì)有小端字節(jié)序?

答案是,計(jì)算機(jī)電路先處理低位字節(jié),效率比較高,因?yàn)橛?jì)算都是從低位開始的。所以,計(jì)算機(jī)的內(nèi)部處理都是小端字節(jié)序。

但是,人類還是習(xí)慣讀寫大端字節(jié)序。所以,除了計(jì)算機(jī)的內(nèi)部處理,其他的場(chǎng)合幾乎都是大端字節(jié)序,比如網(wǎng)絡(luò)傳輸和文件儲(chǔ)存。

4.

計(jì)算機(jī)處理字節(jié)序的時(shí)候,不知道什么是高位字節(jié),什么是低位字節(jié)。它只知道按順序讀取字節(jié),先讀第一個(gè)字節(jié),再讀第二個(gè)字節(jié)。

如果是大端字節(jié)序,先讀到的就是高位字節(jié),后讀到的就是低位字節(jié)。小端字節(jié)序正好相反。

理解這一點(diǎn),才能理解計(jì)算機(jī)如何處理字節(jié)序。

5.

字節(jié)序的處理,就是一句話:

"只有讀取的時(shí)候,才必須區(qū)分字節(jié)序,其他情況都不用考慮。"

處理器讀取外部數(shù)據(jù)的時(shí)候,必須知道數(shù)據(jù)的字節(jié)序,將其轉(zhuǎn)成正確的值。然后,就正常使用這個(gè)值,完全不用再考慮字節(jié)序。

即使是向外部設(shè)備寫入數(shù)據(jù),也不用考慮字節(jié)序,正常寫入一個(gè)值即可。外部設(shè)備會(huì)自己處理字節(jié)序的問題。

6.

字節(jié)序轉(zhuǎn)換的例子

不同cpu平臺(tái)上字節(jié)序通常也不一樣,下面寫個(gè)簡(jiǎn)單的C程序,它可以測(cè)試不同平臺(tái)上的字節(jié)序。

1

#include?

2

#include?

3

int?main()

4

{

5

int?i_num?=?0x12345678;

6

printf("[0]:0x%x\n",?*((char?*)&i_num?+?0));

7

printf("[1]:0x%x\n",?*((char?*)&i_num?+?1));

8

printf("[2]:0x%x\n",?*((char?*)&i_num?+?2));

9

printf("[3]:0x%x\n",?*((char?*)&i_num?+?3));

10

11

i_num?=?htonl(i_num);

12

printf("[0]:0x%x\n",?*((char?*)&i_num?+?0));

13

printf("[1]:0x%x\n",?*((char?*)&i_num?+?1));

14

printf("[2]:0x%x\n",?*((char?*)&i_num?+?2));

15

printf("[3]:0x%x\n",?*((char?*)&i_num?+?3));

16

17

return?0;

18

}

在80X86CPU平臺(tái)上,執(zhí)行該程序得到如下結(jié)果:

[0]:0x78

[1]:0x56

[2]:0x34

[3]:0x12

[0]:0x12

[1]:0x34

[2]:0x56

[3]:0x78

分析結(jié)果,在80X86平臺(tái)上,系統(tǒng)將多字節(jié)中的低位存儲(chǔ)在變量起始地址,使用小端法。htonl將i_num轉(zhuǎn)換成網(wǎng)絡(luò)字節(jié)序,可見網(wǎng)絡(luò)字節(jié)序是大端法。

總結(jié)

以上是生活随笔為你收集整理的java 大端字节序_理解字节序 大端字节序和小端字节序的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。

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