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

做者:李強強 java

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


1、引子

在Java世界裏,99%的工做都是處理這高層。那麼二進制,字節碼這些會在哪裏用到呢? 數組

自問自答:在跨平臺的時候,就凸顯神功了。好比說文件讀寫數據通訊,還有Java編譯後的字節碼文件。下面會有個數據通訊的例子哦。 socket

Java對對象實現Serializablle接口,就能夠將其轉化爲一系列字節,而在通訊中,沒必要要關係數據如何在不一樣機器表示和字節的順序。這裏泥瓦匠對Serializablle接口,不作詳細講解,之後單獨詳解。 工具


2、Java進制轉換

首先認識下Java中的數據類型 spa

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

二、Float型:float(32位)、double(64位) code

二、char字符:unicode字符(16位) 對象

也就是說,一個int等價於長度爲4的字節數組。 接口

Java中進制如何轉換呢?

在Java中,Int整形以及char字符型被包裝的類中提供了一系列的操做方法。好比 java.lang.Integer api如圖所示

QQ截圖20150613210316

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

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一下,咱們能夠在控制檯中看到以下輸出:

17的十六進制: 11
17的八進制:   21
17的二進制:   10001
17
17
17


補充:若是值太大,則須要調用 java.lang.Long 提供的方法。

3、Java基本類型和字節神奇轉換

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

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

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,能夠看到如下輸出:

-77 64 -30 71
1206010035
 

代碼詳細解釋以下:

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

   移位 清零從左往右,按8位獲取1字節

二、這裏使用的是小端法。地位字節放在內存低地址端,即該值的起始地址。補充:32位中分大端模式(PPC)和小段端模式(x86)。


天然,Long也有其轉換方法,以下:

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數組的操做。代碼以下:

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一下,能夠看到如下輸出:

1
2 '李強強'的字節數組爲:
    -64 -18 -57 -65 -57 -65
 

論證:這裏咱們論證了一箇中文,須要兩個字節表示,也就是說一箇中文是16位


4、淺談Java通訊中的數據

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

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

一、對象實現Serializable接口。

實現了Serializable接口的對象,可將它們轉換成一系列字節,並可在之後徹底恢復回原來的樣子。

二、其學號屬性值 1206010035,由客戶端轉換爲字節碼。

三、字節碼傳輸至服務端

四、服務端接收並轉換爲對象屬性值。


5、總結

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

一、Java中進制轉換是什麼?

二、Java中進制轉換的做用?

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

微         博:BYSocket

豆         瓣:BYSocket

FaceBook:BYSocket

Twitter    :BYSocket

相關文章
相關標籤/搜索