String轉換為short[]的整個過程——以漢字“王”為例
一、GBK編碼
GBK中一個漢字用佔用兩個位元組。從GBK編碼表可以查到,“王”字的編碼為CDF5,即第一個位元組為0xCD,轉為二進位制則是11001101;第二個位元組為0xF5,轉為二時制則是11110101。
二、轉換成byte陣列bArray[]
顯然,byte陣列的長度為2,其中bArray[0]為 11001101,bArray[1]為11110101。
三、先了解一下補碼
首先要知道,Java使用補碼來表示二進位制數。在補碼錶示中,最高位為符號位,正數的符號位0,負數為1。補碼的規定如下:
對正數來說,最高位為0,其餘各位代表數值本身(以二進位制表示),如+51的補碼為00110011。對負數而言,把該數絕對值的補碼按位取反
以負數-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;但是,同樣是
但是,在轉換成int(java中的int是4個位元組,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]
六、int結果強制轉換成short的過程
我們知道,Java的short是兩個位元組長,表示的範圍只有-32768~32767。從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