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

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

java -- Big Endian and Little Endian 大端和小端概念讲解及如何转换

發布時間:2023/12/20 编程问答 40 豆豆
生活随笔 收集整理的這篇文章主要介紹了 java -- Big Endian and Little Endian 大端和小端概念讲解及如何转换 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

什么是大端、小端?

字節是計算機中數據處理的基本單位。
計算機中以字節為單位存儲和解釋信息,規定一個字節由八個二進制位構成,即1個字節等于8個比特(1Byte=8bit)。
計算機進行數據處理時,一次存取、加工和傳送的數據長度稱為字(word)。一個字通常由一個或多個(一般是字節的整數位)字節構成。
但并非所有計算機都以相同的順序存儲由多字節值組成的字節??紤]一個由2個字節組成的16位因特網。存儲該值有兩種方式

  • Little Endian 小端: 低階字節存儲在起始地址(A),高階字節存儲在下一個地址(A + 1)
  • Big Endian 大端:高階字節存儲在起始地址(A),低階字節存儲在下一個地址(A + 1)

網絡字節順序: 為了允許具有不同字節順序約定的計算機相互通信,Internet協議為在網絡上傳輸的數據指定了規范的字節順序約定。
network order 即網絡序,默認網絡傳輸字節為大端

小端和大端是存儲多字節數據類型(int、float等)的兩種方式

  • 計算機內存由正整數地址引用。在計算機內存中,把最低有效字節放在最高有效字節之前存儲數字是“自然的”。
    “自然”順序,即在內存中較低有效字節出現在較高有效字節之前。自然順序是采用小端方式存儲
    • 基于英特爾的處理器是小端。ARM處理器是小端處理器。
  • 但許多供應商,如IBM、CRAY和Sun,更喜歡采用相反的順序存儲數據,即采用大端方式存儲。
  • 雙端處理器可以在小端和大端兩種模式下運行。當前的一代ARM處理器是雙端處理器。

根據這些定義,一種32位數據模式,它被視為32位無符號整數。“高階”字節是2的最大次方:231,…, 224?!暗碗A”字節是2的最小次方: 27,…, 20
示例如下:

  • MSB:全稱為Most Significant Bit,在二進制數中屬于最高有效位,MSB是最高加權位,與十進制數字中最左邊的一位類似。
  • LSB:全稱為Least Significant Bit,在二進制數中意為最低有效位,

一般來說,MSB位于二進制數的最左側,LSB位于二進制數的最右側。

字節順序是否影響文件格式?

  • 以1字節為基本單位的文件格式獨立于字節順序,例如ASCII文件。
  • 其他文件格式使用一些固定的端順序格式,例如JPEG文件以大端順序格式存儲。
  • java 全部為大端(與平臺無關): Java二進制文件中的所有內容都以大端順序存儲。這意味著如果您只使用Java,那么所有文件在所有平臺(Mac、PC、UNIX等)上的處理方式都是相同的。
  • C語言默認是小端模式:用C語言編寫的程序通常使用 小端順序

如何知道機器的字節次序

How to Know the Endian-ness?
在Java中,我們可以使用ByteOrder.nativeOrder()方法來獲取CPU使用的字節順序。在使用Intel CPU 或 AMD CPU時,輸出結果都是小端順序

ByteOrder byteOrder = ByteOrder.nativeOrder();System.out.println(byteOrder); //LITTLE_ENDIAN

如何進行大小端的轉換

在java中,可以基于ByteBuffer提供的order方法,進行大小端的轉換
如處理網絡字節流時,先針對獲取的byte[] 進行 buffer.order(ByteOrder.BIG_ENDIAN);

import java.io.UnsupportedEncodingException; import java.nio.ByteBuffer; import java.nio.ByteOrder; import java.nio.charset.StandardCharsets; import java.util.Arrays;public class SimpleDemo {public static void main(String[] args) throws UnsupportedEncodingException {ByteBuffer byteBuffer = ByteBuffer.allocateDirect(10);byteBuffer.put("Test".getBytes(StandardCharsets.UTF_8));byteBuffer.flip();System.out.println(Arrays.toString(convert(byteBuffer, ByteOrder.BIG_ENDIAN)));byteBuffer.flip();System.out.println(Arrays.toString(convert(byteBuffer, ByteOrder.LITTLE_ENDIAN)));}/*** 必須調用完后flip()才可以調用此方法* @param byteBuffer* @param bo* @return*/public static byte[] convert(ByteBuffer byteBuffer, ByteOrder bo) {byteBuffer.order(bo);int len = byteBuffer.limit() - byteBuffer.position();byte[] bytes = new byte[len];if (byteBuffer.isReadOnly()) {return null;} else {byteBuffer.get(bytes);}return bytes;}}

總結

以上是生活随笔為你收集整理的java -- Big Endian and Little Endian 大端和小端概念讲解及如何转换的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。