java Byte和各數據類型(short,int,long,float,double)之間的轉換

  在Java的網絡編程中傳輸的常常是byte數組,但咱們實際中使用的數據類型多是任一種數據類型,這就須要在它們之間相互轉換,轉換的核心在於將其餘類型的數據的每一位轉換成byte類型的數據。下面給出相關的轉換代碼java

1.short與byte數組的互轉編程

[java] view plaincopy數組

  1. /** 網絡

  2. * 轉換short爲byte spa

  3. * .net

  4. * @param b orm

  5. * @param s 須要轉換的short blog

  6. * @param index 字符串

  7. */  get

  8. public static void putShort(byte b[], short s, int index) {  

  9.      b[index + 1] = (byte) (s >> 8);  

  10.      b[index + 0] = (byte) (s >> 0);  

  11. }  

  12.   

  13. /** 

  14. * 經過byte數組取到short 

  15. * 

  16. * @param b 

  17. * @param index  第幾位開始取 

  18. * @return 

  19. */  

  20. public static short getShort(byte[] b, int index) {  

  21.       return (short) (((b[index + 1] << 8) | b[index + 0] & 0xff));  

  22. }  

2.int與byte數組的互轉

[java] view plaincopy

  1. /** 

  2. *將32位的int值放到4字節的byte數組 

  3. * @param num 

  4. * @return 

  5. */  

  6. public static byte[] intToByteArray(int num) {  

  7.    byte[] result = new byte[4];  

  8.    result[0] = (byte)(num >>> 24);//取最高8位放到0下標  

  9.    result[1] = (byte)(num >>> 16);//取次高8爲放到1下標  

  10.    result[2] = (byte)(num >>> 8); //取次低8位放到2下標  

  11.    result[3] = (byte)(num );      //取最低8位放到3下標  

  12.    return result;  

  13. }  

  14.   

  15. /** 

  16. * 將4字節的byte數組轉成一個int值 

  17. * @param b 

  18. * @return 

  19. */  

  20. public static int byteArrayToInt(byte[] b){  

  21.     byte[] a = new byte[4];  

  22.     int i = a.length - 1,j = b.length - 1;  

  23.     for (; i >= 0 ; i--,j--) {//從b的尾部(即int值的低位)開始copy數據  

  24.         if(j >= 0)  

  25.             a[i] = b[j];  

  26.         else  

  27.             a[i] = 0;//若是b.length不足4,則將高位補0  

  28.   }  

  29.     int v0 = (a[0] & 0xff) << 24;//&0xff將byte值無差別轉成int,避免Java自動類型提高後,會保留高位的符號位  

  30.     int v1 = (a[1] & 0xff) << 16;  

  31.     int v2 = (a[2] & 0xff) << 8;  

  32.     int v3 = (a[3] & 0xff) ;  

  33.     return v0 + v1 + v2 + v3;  

  34. }  

3.long與byte數組的互轉

[java] view plaincopy

  1. /** 

  2.      * 將64位的long值放到8字節的byte數組 

  3.      * @param num 

  4.      * @return 返回轉換後的byte數組 

  5.      */  

  6.     public static byte[] longToByteArray(long num) {  

  7.         byte[] result = new byte[8];  

  8.         result[0] = (byte) (num >>> 56);// 取最高8位放到0下標  

  9.         result[1] = (byte) (num >>> 48);// 取最高8位放到0下標  

  10.         result[2] = (byte) (num >>> 40);// 取最高8位放到0下標  

  11.         result[3] = (byte) (num >>> 32);// 取最高8位放到0下標  

  12.         result[4] = (byte) (num >>> 24);// 取最高8位放到0下標  

  13.         result[5] = (byte) (num >>> 16);// 取次高8爲放到1下標  

  14.         result[6] = (byte) (num >>> 8); // 取次低8位放到2下標  

  15.         result[7] = (byte) (num); // 取最低8位放到3下標  

  16.         return result;  

  17.     }  

  18.   

  19.     /** 

  20.      * 將8字節的byte數組轉成一個long值 

  21.      * @param byteArray 

  22.      * @return 轉換後的long型數值 

  23.      */  

  24.     public static long byteArrayToInt(byte[] byteArray) {  

  25.         byte[] a = new byte[8];  

  26.         int i = a.length - 1, j = byteArray.length - 1;  

  27.         for (; i >= 0; i--, j--) {// 從b的尾部(即int值的低位)開始copy數據  

  28.             if (j >= 0)  

  29.                 a[i] = byteArray[j];  

  30.             else  

  31.                 a[i] = 0;// 若是b.length不足4,則將高位補0  

  32.         }  

  33.         // 注意此處和byte數組轉換成int的區別在於,下面的轉換中要將先將數組中的元素轉換成long型再作移位操做,  

  34.         // 若直接作位移操做將得不到正確結果,由於Java默認操做數字時,若不加聲明會將數字做爲int型來對待,此處必須注意。  

  35.         long v0 = (long) (a[0] & 0xff) << 56;// &0xff將byte值無差別轉成int,避免Java自動類型提高後,會保留高位的符號位  

  36.         long v1 = (long) (a[1] & 0xff) << 48;  

  37.         long v2 = (long) (a[2] & 0xff) << 40;  

  38.         long v3 = (long) (a[3] & 0xff) << 32;  

  39.         long v4 = (long) (a[4] & 0xff) << 24;  

  40.         long v5 = (long) (a[5] & 0xff) << 16;  

  41.         long v6 = (long) (a[6] & 0xff) << 8;  

  42.         long v7 = (long) (a[7] & 0xff);  

  43.         return v0 + v1 + v2 + v3 + v4 + v5 + v6 + v7;  

  44.     }  



4.float與byte數組的互轉

[java] view plaincopy

  1. /** 

  2.  * float轉換byte 

  3.  * 

  4.  * @param bb 

  5.  * @param x 

  6.  * @param index 

  7.  */  

  8. public static void putFloat(byte[] bb, float x, int index) {  

  9.     // byte[] b = new byte[4];  

  10.     int l = Float.floatToIntBits(x);  

  11.     for (int i = 0; i < 4; i++) {  

  12.         bb[index + i] = new Integer(l).byteValue();  

  13.         l = l >> 8;  

  14.     }  

  15. }  

  16.   

  17. /** 

  18.  * 經過byte數組取得float 

  19.  * 

  20.  * @param bb 

  21.  * @param index 

  22.  * @return 

  23.  */  

  24. public static float getFloat(byte[] b, int index) {  

  25.     int l;  

  26.     l = b[index + 0];  

  27.     l &= 0xff;  

  28.     l |= ((long) b[index + 1] << 8);  

  29.     l &= 0xffff;  

  30.     l |= ((long) b[index + 2] << 16);  

  31.     l &= 0xffffff;  

  32.     l |= ((long) b[index + 3] << 24);  

  33.     return Float.intBitsToFloat(l);  

  34. }  

5.double與byte數組的互轉

[java] view plaincopy

  1. /** 

  2.  * double轉換byte 

  3.  * 

  4.  * @param bb 

  5.  * @param x 

  6.  * @param index 

  7.  */  

  8. public static void putDouble(byte[] bb, double x, int index) {  

  9.     // byte[] b = new byte[8];  

  10.     long l = Double.doubleToLongBits(x);  

  11.     for (int i = 0; i < 4; i++) {  

  12.         bb[index + i] = new Long(l).byteValue();  

  13.         l = l >> 8;  

  14.     }  

  15. }  

  16.   

  17. /** 

  18.  * 經過byte數組取得float 

  19.  * 

  20.  * @param bb 

  21.  * @param index 

  22.  * @return 

  23.  */  

  24. public static double getDouble(byte[] b, int index) {  

  25.     long l;  

  26.     l = b[0];  

  27.     l &= 0xff;  

  28.     l |= ((long) b[1] << 8);  

  29.     l &= 0xffff;  

  30.     l |= ((long) b[2] << 16);  

  31.     l &= 0xffffff;  

  32.     l |= ((long) b[3] << 24);  

  33.     l &= 0xffffffffl;  

  34.     l |= ((long) b[4] << 32);  

  35.     l &= 0xffffffffffl;  

  36.     l |= ((long) b[5] << 40);  

  37.     l &= 0xffffffffffffl;  

  38.     l |= ((long) b[6] << 48);  

  39.     l &= 0xffffffffffffffl;  

  40.     l |= ((long) b[7] << 56);  

  41.     return Double.longBitsToDouble(l);  

更多關於字符串和序列化的轉換請參看下面兩篇文章:

1.http://blog.csdn.net/cshichao/article/details/8549182 

2.http://blog.csdn.net/cshichao/article/details/8702260

相關文章
相關標籤/搜索