Java中二進位16進位與位元組數組之間的轉換

來源:互聯網
上載者:User

   首先說一下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數組轉化成字串。注意:這裡面不能中英文混合,因為一個字母佔一個位元組,二一個中文佔用兩個位元組,而這個方法是按照一個一個位元組來強轉的,故無法將中文強轉出來。

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.