1. 程式人生 > >String轉換為short[]的整個過程——以漢字“王”為例

String轉換為short[]的整個過程——以漢字“王”為例

 忙了兩天,終於整明白了。

一、GBK編碼

GBK中一個漢字用佔用兩個位元組。從GBK編碼表可以查到,“王”字的編碼為CDF5,即第一個位元組為0xCD,轉為二進位制則是11001101;第二個位元組為0xF5,轉為二時制則是11110101

二、轉換成byte陣列bArray[]

顯然,byte陣列的長度為2,其中bArray[0] 11001101bArray[]11110101

三、先了解一下補碼

首先要知道,Java使用補碼來表示二進位制數。在補碼錶示中,最高位為符號位,正數的符號位0,負數為1。補碼的規定如下:

對正數來說,最高位為0,其餘各位代表數值本身(以二進位制表示),+51的補碼為00110011。對負數而言,把該數絕對值的補碼按位取反

,然後對整個數加1,即得該數的補碼。

以負數-51為例:

1.先將-51的絕對值51轉換成二進位制,即為00110011

2.然後求該二進位制的反碼,即為11001100

3.最後將反碼加1,即為:11001101

已知負數的補碼求值的步驟,還是以11001101為例(首位為1,所以結果必定是負數)

1.然後求該二進位制的反碼,即為11001101的反碼,得到00110010

2.最後將反碼加1,即為:00110011,得出51

3.加上負號,結果為-51

四、byte轉換成int的過程,為什麼要加256? 

第一個位元組0xCD,即11001101。瞭解了前面補碼的知識後,在只有一個位元組(8位)長度時,它的值為-51;但是,同樣是

11001101,如果4個位元組長,即表示為00000000 00000000 00000000 11001101,它代表的是205

但是,在轉換成intjava中的int4個位元組,32位)時,此時Java是用什麼來表示-51呢?根據前面說的補碼,可以得出:

(1) 51轉為二進位制,即00000000 00000000 00000000 00110011

(2)反碼,即11111111 11111111 11111111 11001100

(3)1,即11111111 11111111 11111111 11001101

11111111 11111111 11111111 11001101加上256(即00000000 00000000 00000001 00000000),就變成了00000000 00000000 0000000011001101,這樣就得到了205

五、得到int型別的結果

bArray[0]*256+ bArray[1]

的結果,即205*256+245=52725,即00000000 00000000 11001101 11110101

六、int結果強制轉換成short的過程

我們知道,Javashort是兩個位元組長,表示的範圍只有-3276832767。從00000000 00000000 11001101 11110101中擷取最後16位(兩個位元組),得到11001101 11110101,根據前面說的根據補碼求值的方法:

11001101 11110101的補碼是00110010 00001010;加1之後00110010 00001011,即12811;加上負號,得到-12811

七、附原始碼:

package Test;


public class TestChar {
	
	public static short[] strToShortArray(java.lang.String str)
	{					
		char[] c = str.toCharArray();		
		short[] s = new short[c.length];
		for (int i=0; i<c.length; i++) 
		{
			s[i] = CharToShort( c[i] );
		}					

		return s;
	}		
    public static short CharToShort(char c)
    {
        char[] t = new char[1];
        t[0] = c;
        String strTemp = new String(t);        
        byte[] cc = strTemp.getBytes();
        System.out.println(cc[0]);
        System.out.println(cc[1]);
        
        if (cc.length==1)
        {
            return (short)(cc[0] >= 0 ? cc[0] : cc[0] + 256);
        }
        else
        {
            int v1 = cc[0] >= 0 ? ((int)(cc[0])) : cc[0] + 256;
            int v2 = cc[1] >= 0 ? ((int)(cc[1])) : cc[1] + 256;            
            return (short)(v1 * 256 + v2);
        }
    }	
	public static void main(String[] args)
	{
		String str="王";
		short[] ret=strToShortArray(str);
		for(int i=0;i<ret.length;i++)
		{
			System.out.println(ret[i]);
		}
		return;
	}
}

輸出:

-51

-11

-12811