1. 程式人生 > >Java中的byte/char/String資料型別轉換

Java中的byte/char/String資料型別轉換

前言:專案中遇到了一個問題,Android手機和硬體建立Socket通訊,當手機批量傳送資料時,傳送頻率高於微控制器接收報文進入中斷處理的頻率,導致硬體處理不過來。解決的方法是將原先的String型別的大量報文包含的資訊,簡化成一條十六進位制的報文。

在解決完這個問題後,才意識到Java中資料型別轉換的重要性,而且Java和C之間的Socket通訊最好全部由位元組來實現,所以post一篇心得和經驗。

一、 字元編碼方式及型別轉換簡介

通常意義上的字元和數字所代表的含義和機器語言是有出入的。對機器而言,“數字”只有代表高低電平的0或1;而無論1~9,a~z,A~Z,漢字,拉丁字母,希臘字母等等,都被視為“字元”。編碼,就是將這些“字元”和固定長度的0、1組合唯一對應起來。

常用的編碼方式有Unicode、ASCII、UTF-8、GB2312、ISO-8899-1等。採用不同的編碼方式,同樣的n位二進位制“數字”組合代表的“字元”也會不一樣。具體採用什麼樣的編碼方式,對“字元”怎樣解析,就要看程式設計所在的平臺是什麼樣了。同時,為了方便,我們並不會直接用n位二進位制的“數字”表示,而是用它的十六進位制“數字”表示。

在介紹Java平臺下的資料型別轉換時,本文涉及到了Unicode、ASCII、GB2312、ISO-8899-1,簡單說明如下:

  1. Java核心採用Unicode編碼,Unicode又稱為萬國碼、統一碼,是完全國際化的字符集,可以表示全部人類語言中的字元。

  2. Unicode編碼方式是雙位元組編碼,即每個字元=兩個位元組=16位數,儲存範圍在\u0000~\uFFFF。表示一個Unicode的字元時,通常會用“\u”然後緊接著一組十六進位制的數字來表示這一個字元

  3. 在Java中,有以下八種基本資料型別

    (1) byte、int、short之間不會互相轉換,因為容量小的資料型別會自動轉換為大的資料型別,所以在運算時,它們都會被轉換為int型

    (2)容量大的資料型別轉換成容量小的資料型別時,要加上強制轉換符,但可能會造成精度降低或資料溢位

    (3)Java中的型別轉換總結來說就是 整型-字元型-String 之間的轉換

    (4)String不屬於Java的基本資料型別,String的本質是字元陣列,是類物件

    資料型別 名稱 長度 備註
    byte 位元組型 1位元組 = 8bit 表示資料範圍:-128~127
    short 短整型 2位元組 = 16bit
    char 字元型 2位元組 = 16bit 等價於Unicode編碼
    int 整型 4位元組 = 32bit
    long 長整型 8位元組
    float 單精度浮點型 4位元組 精度:7-8位
    double 雙精度浮點型 8位元組
    boolean 布林型 true/false

二、 byte\char轉換和Unicode編碼

  1. 從上面的表中,我們已經知道了char是2位元組,byte是1位元組,舉例說明如下:

    char a=’中’ 合法:在GB2312編碼方式中,一箇中文字元=2位元組
    char a=’ab’ 非法:儘管一個char佔用2位元組,但是隻能表示一個字元
    byte a=’中’ 非法:1位元組不能存放中文字元
    byte a=’a’ 合法:一個字元=1位元組

  2. 測試Demo:輸入Unicode,分別轉換成ISO、GB2312、ASCII編碼代表的字元

(1) 程式

輸入包括:2位byte=1箇中文字元;1位byte=1個字元,並通過不同編碼方式轉碼不同成字元


private void Byte2Char() {
    // TODO Auto-generated method stub
    byte b[] = {(byte)'\u0080',(byte)'\u0001',(byte)'\u007f',(byte)'\u00ff',(byte)'\u00BA',(byte)'\u00CF'};             
    /**
     *  通過ByteToCharConverter類轉換不可行,sun.io.*包屬於內部API,已經不可用
     *  ByteToCharConverter converter = ByteToCharConverter.getConverter("gb2312");
     *  char c[] = converter.convertAll(b);         
     */         

    Charset charSet = Charset.forName("8859_1");
    ByteBuffer byteBuffer = ByteBuffer.allocate(b.length);
    byteBuffer.put(b);
    byteBuffer.flip();
    CharBuffer charBuffer = charSet.decode(byteBuffer);

    textView1.setText("Byte2Char() 單位元組編碼 ISO-8899-1"
            +"\n"+"目標格式:"+charSet
            +"\n"+"輸入4位元組byte:0080 0001 007f 00ff 00BA 00CF "
            +"\n"+"輸出Char字元:"+charBuffer
            +"\n"+"byte型8位2進位制:"+b[0]+"/"+b[1]+"/"+b[2]+"/"+b[3]+"/"+b[4]+"/"+b[5]
            );
}

(2)輸出

Unicode、byte和char

注:ISO-8899-1轉碼時Log有誤,“輸入4位元組byte”應改為“輸入6位元組byte”

三、 Java中的String類

下面是String原始碼類註釋中的一段話:

Strings are constant; their values cannot be changed after they are created. String buffers support mutable strings. Because String objects are immutable they can be shared.

同時,String類還使用了final修飾符,下面是String類的成員變數定義:

private final char value[]
private final int count

String的實質就是字元陣列,以上內容包含了String的三個特點:
(1)String是值不可變的常量
(2)String是執行緒安全的
(3)String類是不可繼承的

五、 參考資料