首先說一下ByteBuffer 這個抽象類別,一般在伺服器和用戶端之間的通訊他們之間的通訊格式都是固定的,都有訊息頭和訊息體,也就是我們常說的自訂通訊協定(都是基於TCP/IP層) 每個訊息頭和訊息體都有固定的屬性(也就是比如說:訊息頭有20個位元組,前十個位元組表示訊息長度,後十個位元組表示訊息類型,這個訊息長度和訊息類型就是所說的屬性) 每次用戶端和服務端之間的通訊訊息都是按照這樣的固定格式互相發送。既然他們的格式個長度都是固定的,那如果長度不夠怎麼辦?就必須補全用伺服器和用戶端相互理解的預留位置去補全。ByteBuffer這個位元組緩衝區是繼承與Buffer,在填充位元組數組的時候非常的方便,下面是一個小的例子:
假如:有一個輸入的密碼,我不知道他的位元組數,但是他必須滿21個位元組:
/* * 將密碼填充為21個位元組*/public byte[] password(){String passWord ="11111111111111111111";ByteBuffer passWord_byte = ByteBuffer.allocate(21);byte[] buf_passWord = passWord.getBytes();ByteBuffer t = ByteBuffer.allocate(1);if(buf_passWord.length<21){passWord_byte.put(buf_passWord);for(int i=buf_passWord.length;i<21;i++){passWord_byte.put(t.array());}}else{passWord_byte.put(buf_passWord);}return passWord_byte.array();}
他返回的就是一個長度為21的位元組數組。我用的空位元組去填充的。ByteBuffer t = ByteBuffer.allocate(1);passWord_byte.put(t.array()); 先聲明一個長度為1的位元組緩衝區,讓後將他返回的位元組數組填充到前面聲明的位元組緩衝區中。
由於用戶端與伺服器之間的通訊格式是固定的所以有些屬性也是固定的:比如:我登陸伺服器,發送密碼和使用者名稱過去,伺服器給我返回一個訊息,這個訊息中的某個屬性就是定義好的 比如0x11 代表登陸成功,0x10 代表登陸失敗。必須將其返回回來的位元組轉換成這樣的16進位或10進位數與事先定義好的資料區比較才知道是否登陸成功或失敗。下面就介紹一下幾種進位的互相轉換(也是參考網上的例子,如有雷同請見諒!)
位元組數組轉化為整形:
public int byte_Integer(byte[] str){int result = ((((str[0] & 0xff) << 8 | (str[1] & 0xff)) << 8) | (str[2] & 0xff)) << 8 | (str[3] & 0xff);return result;}
整形轉化為位元組數組:
方法一:
public byte[] Integer_byte(int num){byte[] result = new byte[4];result[0] =(byte)((num>>24) &0xff);result[1] =(byte)((num>>16) &0xff);result[2] =(byte)((num>>8) &0xff);result[3] =(byte)((num>>0) &0xff);return result;}
方法二:
public byte[] Integer_byte(int num){ByteBuffer buff=ByteBuffer.allocate(4);buff.putInt(num);byte []bytes=buff.array();return bytes;}
方法一 注意應該先將先移動高位在移動低位,如果是:num>>0,num>>8 .. 然後將擷取的位元組數組放入前面的位元組數組轉化為整型的函數中 則得不到原有的num
方法二 利用的是ByteBuffer中的putInt()函數將整型轉化為位元組
16進位整形,8進位整形 的位元組數組轉化如上一樣轉化。
字元轉化為位元組數組:
public byte[] String_byte(String str){byte [] result = str.getBytes();return result;}
其實就是依靠String類中的getBytes()這個函數返回該字元的位元組數組
位元組數組轉化為字元:
public String byte_String(byte[] str){char [] c = new char[]{};for(int i=0;i<str.length;i++){c[i] = (char)str[i];}String buffer = new String(c);return buffer;}
其實就是將位元組強制轉化為cha類型,用一個cha數組儲存,讓後將整個cha數組轉化成字串。注意:這裡面不能中英文混合,因為一個字母佔一個位元組,二一個中文佔用兩個位元組,而這個方法是按照一個一個位元組來強轉的,故無法將中文強轉出來。