Java I/O : Java中的進位詳解

來源:互聯網
上載者:User

標籤:

李強強

上一篇,泥瓦匠基礎地講了下Java I/O : Bit Operation 位元運算。這一講,泥瓦匠帶你走進Java中的進位詳解。

 

一、引子

在Java世界裡,99%的工作都是處理這高層。那麼二進位,位元組碼這些會在哪裡用到呢?

自問自答:在跨平台的時候,就凸顯神功了。比如說檔案讀寫資料通訊,還有Java編譯後的位元組碼檔案。下面會有個資料通訊的例子哦。

Java對對象實現Serializablle介面,就可以將其轉化為一系列位元組,而在通訊中,不必要關係資料如何在不同機器表示和位元組的順序。這裡泥瓦匠對Serializablle介面,不做詳細講解,以後單獨詳解。

 

二、Java進位轉換

首先認識下Java中的資料類型

1、Int整型:byte(8位,-128~127)、short(16位)、int(32位)、long(64位)

2、Float型:float(32位)、double(64位)

2、char字元:unicode字元(16位)

也就是說,一個int等價於長度為4的位元組數組。

Java中進位如何轉換呢?

在Java中,Int整形以及char字元型被封裝的類中提供了一系列的操作方法。比如 java.lang.Integer api

下面泥瓦匠寫個demo,驗證下。

?
123456789101112131415 package javaBasic.oi.byteoper; public class IntegerOper{    public static void main(String[] args)    {        System.out.println("17的十六進位: " + Integer.toHexString(17));        System.out.println("17的八進位:     "   + Integer.toOctalString(17));        System.out.println("17的二進位:     "   + Integer.toBinaryString(17));         System.out.println(Integer.valueOf("11", 16));        System.out.println(Integer.valueOf("21", 8));        System.out.println(Integer.valueOf("00010001", 2));    }}

右鍵Run一下,我們可以在控制台中看到如下輸出:

?
123456 17的十六進位: 1117的八進位:   2117的二進位:   10001171717

補充:如果值太大,則需要調用 java.lang.Long 提供的方法。

 

三、Java基本類型和位元組神奇轉換

這裡泥瓦匠想到了自己是個學生,典型的OO思想。那學號:1206010035是整型,怎麼轉成位元組呢,上面說的擁有位元組碼的對象能通訊。所以,學校關於學號這個都是這樣的方式通訊的。因此,要將學號轉成位元組碼才行。

泥瓦匠就寫了個工具類 IntegerConvert.java:

?
123456789101112131415161718192021222324252627282930313233343536373839 package javaBasic.oi.byteoper; public class IntegerConvert{    /**     * Int轉位元組數組     */    public static byte[] int2Bytes(int inta)    {        // 32位Int可存於長度為4的位元組數組        byte[] bytes = new byte[4];        for (int i = 0; i < bytes.length; i++)            bytes[i] = (byte)(int)((inta >> i * 8) & 0xff);// 移位和清零                 return bytes;    }         /**     * 位元組數組轉Int     */    public static int bytes2Int(byte[] bytes)    {        int inta = 0;        for (int i = 0; i < bytes.length; i++)            inta += (int)((bytes[i] & 0xff) << i * 8);// 移位和清零                 return inta;    }         public static void main(String[] args)    {        // 將我的學號轉換成位元組碼        byte[] bytes = IntegerConvert.int2Bytes(1206010035);        System.out.println(bytes[0] + " " + bytes[1] + " " + bytes[2] + " " + bytes[3]);        // 位元組碼就可以轉換回學號        System.out.println(IntegerConvert.bytes2Int(bytes));    } }

跑一下,右鍵Run,可以看到以下輸出:

?
12 -77 64 -30 711206010035

代碼詳細解釋如下:

1、(inta >> i * 8) & 0xff

   移位 清零從左往右,按8位擷取1位元組

2、這裡使用的是小端法。地位位元組放在記憶體低地址端,即該值的起始地址。補充:32位中分大端模式(PPC)和小段端模式(x86)。

 

自然,Long也有其轉換方法,如下:

?
123456789101112131415161718192021222324252627 public class LongConvert{    /**     * long 轉 byte數組     */    public static byte[] long2Bytes(long longa)    {        byte[] bytes = new byte[8];        for (int i = 0; i < bytes.length; i++)            bytes[i] = (byte)(long)(((longa) >> i * 8) & 0xff); // 移位和清零                 return bytes;    }         /**     * byte數組 轉 long     */    public static long bytes2Long(byte[] bytes)    {        long longa = 0;        for (int i = 0; i < bytes.length; i++)            longa += (long)((bytes[i] & 0xff) << i * 8); // 移位和清零                 return longa;    }     }

 

那字串,字元數組呢?比如泥瓦匠的名字:李強強

Java也提供了一系列的方法,其實 java.lang.String 封裝了char[],其中本質還是對char數組的操作。代碼如下:

?
1234567891011121314 package javaBasic.oi.byteoper; public class StringConvert{    public static void main(String[] args)    {        String str = "李強強";        byte[] bytes = str.getBytes();        // 列印位元組數組        System.out.println("‘李強強‘的位元組數組為:");        for (int i = 0; i < bytes.length; i++)            System.out.print("\t" + bytes[i]);    }}

右鍵Run一下,可以看到以下輸出:

?
12 ‘李強強‘的位元組數組為:    -64 -18 -57 -65 -57 -65

論證:這裡我們論證了一個中文,需要兩個位元組表示,也就是說一個中文是16位

 

四、淺談Java通訊中的資料

下面簡單把泥瓦匠學生的故事延續。

,庫表中一個學生對象,有個屬性是學號。這時候用戶端要向服務端發送這個對象。過程如下:

1、對象實現Serializable介面。

實現了Serializable介面的對象,可將它們轉換成一系列位元組,並可在以後完全恢複回原來的樣子。

2、其學號屬性值 1206010035,由用戶端轉換為位元組碼。

3、位元組碼傳輸至服務端

4、服務端接收並轉換為對象屬性值。

 

五、總結

此文講的點有點多,泥瓦匠就想把這塊用到的知識點串起來,然後慢慢每個講解。總結如下:

1、Java中進位轉換是什嗎?

2、Java中進位轉換的作用?

 

 

 

Writer      :BYSocket(泥沙磚瓦漿木匠)

微         博:BYSocket

豆         瓣:BYSocket

FaceBook:BYSocket

Twitter    :BYSocket

Java I/O : Java中的進位詳解

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.