java中byte数组与int,long,short,float,char之间的转换

时间: 2012-09-03 / 分类: Java学习 / 浏览次数: 7,809 views / 11个评论 发表评论

我们都知道,在socket传输中,发送、者接收的数据都是 byte数组,而实际中我们会传输各种类型的数据,比如int,long,short间等等

这就需要我们在使用中完成byte类型和int,long,short,float之间的转换

转换的核心在于其他类型的数据每位所占的转换后所占的byte不同

下面给出相关的转换代码

首先说一下用的最多的Byte和int之间的转换


/**
*将32位的int值放到4字节的<a href="http://www.ztyhome.com/tag/byte/" title="查看byte中的全部文章" target="_blank">byte</a>[]里
[email protected]
[email protected]
*/
public static byte[] int2byteArray(int num) {
   byte[] result = new byte[4];
   result[0] = (byte)(num &gt;&gt;&gt; 24);//取最高8位放到0下标
   result[1] = (byte)(num &gt;&gt;&gt; 16);//取次高8为放到1下标
   result[2] = (byte)(num &gt;&gt;&gt; 8); //取次低8位放到2下标
   result[3] = (byte)(num );      //取最低8位放到3下标
   return result;
}

/**
* 将4字节的byte数组转成一个int值
[email protected]
[email protected]
*/
public static int byteArray2int(byte[] b){
    byte[] a = new byte[4];
    int i = a.length - 1,j = b.length - 1;
    for (; i &gt;= 0 ; i--,j--) {//从b的尾部(即int值的低位)开始copy数据
        if(j &gt;= 0)
            a[i] = b[j];
        else
            a[i] = 0;//如果b.length不足4,则将高位补0
  }
    int v0 = (a[0] &amp; 0xff) &lt;&lt; 24;//&amp;0xff将byte值无差异转成int,避免Java自动类型提升后,会保留高位的符号位
    int v1 = (a[1] &amp; 0xff) &lt;&lt; 16;
    int v2 = (a[2] &amp; 0xff) &lt;&lt; 8;
    int v3 = (a[3] &amp; 0xff) ;
    return v0 + v1 + v2 + v3;
}

short和byte的互转


/**
* 转换short为byte
*
[email protected]
[email protected]
*            需要转换的short
[email protected]
*/
public static void putShort(byte b[], short s, int index) {
     b[index + 1] = (byte) (s >> 8);
     b[index + 0] = (byte) (s >> 0);
}

/**
* 通过byte数组取到short
*
[email protected]
[email protected]
*            第几位开始取
[email protected]
*/
public static short getShort(byte[] b, int index) {
      return (short) (((b[index + 1] << 8) | b[index + 0] & 0xff));
}

byte和char类型的转换

 /**
     * 字符到字节转换
     *
     * @param ch
     * @return
     */
    public static void putChar(byte[] bb, char ch, int index) {
        int temp = (int) ch;
        // byte[] b = new byte[2];
        for (int i = 0; i < 2; i ++ ) {
             // 将最高位保存在最低位
            bb[index + i] = new Integer(temp & 0xff).byteValue();
            temp = temp >> 8; // 向右移8位
        }
    }

    /**
     * 字节到字符转换
     *
     * @param b
     * @return
     */
    public static char getChar(byte[] b, int index) {
        int s = 0;
        if (b[index + 1] > 0)
            s += b[index + 1];
        else
            s += 256 + b[index + 0];
        s *= 256;
        if (b[index + 0] > 0)
            s += b[index + 1];
        else
            s += 256 + b[index + 0];
        char ch = (char) s;
        return ch;
    }

byte和float的转换

    /**
     * float转换byte
     *
     * @param bb
     * @param x
     * @param index
     */
    public static void putFloat(byte[] bb, float x, int index) {
        // byte[] b = new byte[4];
        int l = Float.floatToIntBits(x);
        for (int i = 0; i < 4; i++) {
            bb[index + i] = new Integer(l).byteValue();
            l = l >> 8;
        }
    }

    /**
     * 通过byte数组取得float
     *
     * @param bb
     * @param index
     * @return
     */
    public static float getFloat(byte[] b, int index) {
        int l;
        l = b[index + 0];
        l &= 0xff;
        l |= ((long) b[index + 1] << 8);
        l &= 0xffff;
        l |= ((long) b[index + 2] << 16);
        l &= 0xffffff;
        l |= ((long) b[index + 3] << 24);
        return Float.intBitsToFloat(l);
    }

byte和double转换


    /**
     * double转换byte
     *
     * @param bb
     * @param x
     * @param index
     */
    public static void putDouble(byte[] bb, double x, int index) {
        // byte[] b = new byte[8];
        long l = Double.doubleToLongBits(x);
        for (int i = 0; i < 4; i++) {
            bb[index + i] = new Long(l).byteValue();
            l = l >> 8;
        }
    }

    /**
     * 通过byte数组取得float
     *
     * @param bb
     * @param index
     * @return
     */
    public static double getDouble(byte[] b, int index) {
        long l;
        l = b[0];
        l &= 0xff;
        l |= ((long) b[1] << 8);
        l &= 0xffff;
        l |= ((long) b[2] << 16);
        l &= 0xffffff;
        l |= ((long) b[3] << 24);
        l &= 0xffffffffl;
        l |= ((long) b[4] << 32);
        l &= 0xffffffffffl;
        l |= ((long) b[5] << 40);
        l &= 0xffffffffffffl;
        l |= ((long) b[6] << 48);
        l &= 0xffffffffffffffl;
        l |= ((long) b[7] << 56);
        return Double.longBitsToDouble(l);
    }
}

稍微注意一下就能发现,各种类型与byte之间的转换主要是位数的差异,在转换过程中涉及到的算法也是移位,只要你理解了这个过程,那么数据传输过程涉及到byte和其他类型数据的转换就很简单了



.

*******************************************************************

上面是广告! 真的是广告!! 真的真的啊!!!

  1. 博主,你这个转换程序好像所有的byte数组的处理都反过来了,就用short举例吧,你这个相当于把第一个字节的放到第二个字节的位置去了,要不然就是你是把byte 里的第一个元素作为他的个位,第二个元素作为十位,这样的话你传递进来的byte数组的参数岂不是没什么意义了吗?

-----------------------------------------------------Copyright © 2011-2012--浙ICP备12011997---------------------------- ---------------------- ------------------------

无觅相关文章插件,快速提升流量