利用socket進行網絡傳輸的時候往往需要將int轉換為bytes,將string轉換為bytes以及一些其他類型的數據轉換
java和c類型的區別: 變量類型 C中字節數 Java中字節數 char 1 2 byte 無 1 short 2 2 int 4 4 long 4 8
int 和bytes
int-bytes 1:Integer.toString(int b).getBytes()); 2: public static void int2Bytes(int i, byte[] buf, int offset) { buf[offset] = (byte) i; i >>= 8; buf[offset + 1] = (byte) i; i >>= 8; buf[offset + 2] = (byte) i; i >>= 8; buf[offset + 3] = (byte) i; } bytes-int 1:Integer.parseInt((bytes[] b).toString()) 2: private static int byte2Int(byte[] bs) { int retVal = 0; int len = bs.length < 4 ? bs.length : 4; for (int i = 0; i < len; i++) { retVal |= (bs[i] & 0xFF) << ((i & 0x03) << 3); } return retVal; // 如果確定足4位,可直接返回值 //return (bs[0]&0xFF) | ((bs[1] & 0xFF)<<8) | ((bs[2] & 0xFF)<<16) | ((bs[3] & 0xFF)<<24); }
int和String
int-String int i 1:Integer.toString(i,xx); //xx為想要用什么進制來表示,缺省為10進制 2:i+" "; 3:String.valueOf(i);//和1不同的是他可以轉換的除了對象還可以為基本數據類型比如long boolean double //而且i可以為null但是1的i為null的話就會報錯拋出異常 String-int String s 1:Integer.parseInt(s)
bytes和String
String-bytes:(String a) 1:a.getBytes(x);//x為指定的編碼,缺省的話為utf-8 //同一個字符串調用a.getBytes()兩次並且分別打印,他們的內容會不同,調用一次返回的都是一個新的數組對像, 你打印的是對象引用的哈希碼(不是對像里面的內容), //肯定是不一樣的(因為每次返回都是一個新的變量).他們的內容是一樣的. 2:(byte)a.charAt(i) bytes-String :bytes[] b 1:String a=new String(b,x);//x為指定的編碼,缺省的話為utf-8 2: StringBuffer sb=new StringBuffer(); for(int i=0;i<b.length;i++){ sb.append((char)b[i]); } System.out.println(sb.toString());
特別注意編碼問題:
1:
bytebytes[] = new byte[] { 50, 0, -1, 28, -24 };
String string = new String(bytes);
byte[] ret = string.getBytes();
查看ret的數據發現是50, 0, -17, -65, -67, 28, -17, -65, -67,發現數據並不是原來的數據。
而使用如下代碼就可以得到原來的數據:
2:
bytebytes[] = new byte[] { 50, 0, -1, 28, -24 };
StringisoString = new String(bytes, "ISO-8859-1");
byte[] isoret = isoString.getBytes("ISO-8859-1");
第一種方法默認是用UTF-8編碼來生成String的,用System.getProperty("sun.jnu.encoding")可以得到
Android默認編碼是UTF-8。UTF-8是可變長度的編碼,原來的字節數組就被改變了。而ISO8859-1通常叫做
Latin-1,Latin-1包括了書寫所有西方歐洲語言不可缺少的附加字符,其中 0~127的字符與ASCII碼相同,
它是單字節的編碼方式,這樣第二種方式生成的String里的字節數組就跟原來的字節數組一樣。在new String
使用其他編碼如GBK,GB2312的話一樣也會導致字節數組發生變化,因此要想獲取String里單字節數組,就應該
使用iso8859-1編碼。