java Byte和各数据类型(short,int,long,float,double)之间的转换

本文介绍如何在Java中实现基本数据类型如short、int、long、float和double与byte数组之间的相互转换,这对于网络编程及数据传输非常重要。

在Java的网络编程中传输的经常是byte数组,但我们实际中使用的数据类型可能是任一种数据类型,这就需要在它们之间相互转换,转换的核心在于将其他类型的数据的每一位转换成byte类型的数据。下面给出相关的转换代码

1.short与byte数组的互转

[java]  view plain copy
  1. /** 
  2. * 转换short为byte 
  3. * 
  4. * @param b 
  5. * @param s 需要转换的short 
  6. * @param index 
  7. */  
  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 plain copy
  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 plain copy
  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 plain copy
  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 plain copy
  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);  
  42. }  

更多关于字符串和序列化的转换请参看下面两篇文章:

1.http://blog.youkuaiyun.com/cshichao/article/details/8549182 

2.http://blog.youkuaiyun.com/cshichao/article/details/8702260



版权声明:本文为博主原创文章,未经博主允许不得转载。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值