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,簡單說明如下:
Java核心採用Unicode編碼,Unicode又稱為萬國碼、統一碼,是完全國際化的字符集,可以表示全部人類語言中的字元。
Unicode編碼方式是雙位元組編碼,即每個字元=兩個位元組=16位數,儲存範圍在\u0000~\uFFFF。表示一個Unicode的字元時,通常會用“\u”然後緊接著一組十六進位制的數字來表示這一個字元
在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編碼
從上面的表中,我們已經知道了char是2位元組,byte是1位元組,舉例說明如下:
char a=’中’ 合法:在GB2312編碼方式中,一箇中文字元=2位元組
char a=’ab’ 非法:儘管一個char佔用2位元組,但是隻能表示一個字元
byte a=’中’ 非法:1位元組不能存放中文字元
byte a=’a’ 合法:一個字元=1位元組測試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)輸出
注: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類是不可繼承的