`

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

    博客分类:
  • java
 
阅读更多

 

本文引用此处

http://www.2cto.com/kf/201308/235099.html

 

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

1.short与byte数组的互转

 

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

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

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

/**
* 通过byte数组取到short
*
* @param b
* @param index  第几位开始取
* @return
*/
public static short getShort(byte[] b, int index) {
      return (short) (((b[index + 1] << 8) | b[index + 0] & 0xff));
}
2.int与byte数组的互转


[java]
/**
*将32位的int值放到4字节的byte数组
* @param num
* @return
*/ 
public static byte[] intToByteArray(int num) { 
   byte[] result = new byte[4]; 
   result[0] = (byte)(num >>> 24);//取最高8位放到0下标  
   result[1] = (byte)(num >>> 16);//取次高8为放到1下标  
   result[2] = (byte)(num >>> 8); //取次低8位放到2下标  
   result[3] = (byte)(num );      //取最低8位放到3下标  
   return result; 

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

/**
*将32位的int值放到4字节的byte数组
* @param num
* @return
*/
public static byte[] intToByteArray(int num) {
   byte[] result = new byte[4];
   result[0] = (byte)(num >>> 24);//取最高8位放到0下标
   result[1] = (byte)(num >>> 16);//取次高8为放到1下标
   result[2] = (byte)(num >>> 8); //取次低8位放到2下标
   result[3] = (byte)(num );      //取最低8位放到3下标
   return result;
}

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

3.long与byte数组的互转


[java]
/**
     * 将64位的long值放到8字节的byte数组
     * @param num
     * @return 返回转换后的byte数组
     */ 
    public static byte[] longToByteArray(long num) { 
        byte[] result = new byte[8]; 
        result[0] = (byte) (num >>> 56);// 取最高8位放到0下标  
        result[1] = (byte) (num >>> 48);// 取最高8位放到0下标  
        result[2] = (byte) (num >>> 40);// 取最高8位放到0下标  
        result[3] = (byte) (num >>> 32);// 取最高8位放到0下标  
        result[4] = (byte) (num >>> 24);// 取最高8位放到0下标  
        result[5] = (byte) (num >>> 16);// 取次高8为放到1下标  
        result[6] = (byte) (num >>> 8); // 取次低8位放到2下标  
        result[7] = (byte) (num); // 取最低8位放到3下标  
        return result; 
    } 
 
    /**
     * 将8字节的byte数组转成一个long值
     * @param byteArray
     * @return 转换后的long型数值
     */ 
    public static long byteArrayToInt(byte[] byteArray) { 
        byte[] a = new byte[8]; 
        int i = a.length - 1, j = byteArray.length - 1; 
        for (; i >= 0; i--, j--) {// 从b的尾部(即int值的低位)开始copy数据  
            if (j >= 0) 
                a[i] = byteArray[j]; 
            else 
                a[i] = 0;// 如果b.length不足4,则将高位补0  
        } 
        // 注意此处和byte数组转换成int的区别在于,下面的转换中要将先将数组中的元素转换成long型再做移位操作,  
        // 若直接做位移操作将得不到正确结果,因为Java默认操作数字时,若不加声明会将数字作为int型来对待,此处必须注意。  
        long v0 = (long) (a[0] & 0xff) << 56;// &0xff将byte值无差异转成int,避免Java自动类型提升后,会保留高位的符号位  
        long v1 = (long) (a[1] & 0xff) << 48; 
        long v2 = (long) (a[2] & 0xff) << 40; 
        long v3 = (long) (a[3] & 0xff) << 32; 
        long v4 = (long) (a[4] & 0xff) << 24; 
        long v5 = (long) (a[5] & 0xff) << 16; 
        long v6 = (long) (a[6] & 0xff) << 8; 
        long v7 = (long) (a[7] & 0xff); 
        return v0 + v1 + v2 + v3 + v4 + v5 + v6 + v7; 
    } 

/**
  * 将64位的long值放到8字节的byte数组
  * @param num
  * @return 返回转换后的byte数组
  */
 public static byte[] longToByteArray(long num) {
  byte[] result = new byte[8];
  result[0] = (byte) (num >>> 56);// 取最高8位放到0下标
  result[1] = (byte) (num >>> 48);// 取最高8位放到0下标
  result[2] = (byte) (num >>> 40);// 取最高8位放到0下标
  result[3] = (byte) (num >>> 32);// 取最高8位放到0下标
  result[4] = (byte) (num >>> 24);// 取最高8位放到0下标
  result[5] = (byte) (num >>> 16);// 取次高8为放到1下标
  result[6] = (byte) (num >>> 8); // 取次低8位放到2下标
  result[7] = (byte) (num); // 取最低8位放到3下标
  return result;
 }

 /**
  * 将8字节的byte数组转成一个long值
  * @param byteArray
  * @return 转换后的long型数值
  */
 public static long byteArrayToInt(byte[] byteArray) {
  byte[] a = new byte[8];
  int i = a.length - 1, j = byteArray.length - 1;
  for (; i >= 0; i--, j--) {// 从b的尾部(即int值的低位)开始copy数据
   if (j >= 0)
    a[i] = byteArray[j];
   else
    a[i] = 0;// 如果b.length不足4,则将高位补0
  }
  // 注意此处和byte数组转换成int的区别在于,下面的转换中要将先将数组中的元素转换成long型再做移位操作,
  // 若直接做位移操作将得不到正确结果,因为Java默认操作数字时,若不加声明会将数字作为int型来对待,此处必须注意。
  long v0 = (long) (a[0] & 0xff) << 56;// &0xff将byte值无差异转成int,避免Java自动类型提升后,会保留高位的符号位
  long v1 = (long) (a[1] & 0xff) << 48;
  long v2 = (long) (a[2] & 0xff) << 40;
  long v3 = (long) (a[3] & 0xff) << 32;
  long v4 = (long) (a[4] & 0xff) << 24;
  long v5 = (long) (a[5] & 0xff) << 16;
  long v6 = (long) (a[6] & 0xff) << 8;
  long v7 = (long) (a[7] & 0xff);
  return v0 + v1 + v2 + v3 + v4 + v5 + v6 + v7;
 }

 


4.float与byte数组的互转


[java]
/**
 * 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); 

/**
 * 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);
}

5.double与byte数组的互转


[java]
/**
 * 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); 
}

分享到:
评论

相关推荐

    java实现的字节数组转换成基本类型,基本类型转换成byte[]

    char short int long float double 转换成byte数组

    java基本类型与byte数组互相转换.pdf

    double 类型是 64 位的浮点数类型,转换成 byte 数组需要将 double 类型转换成 long 类型,然后将 long 类型转换成 byte 数组。例如: ```java public static byte[] doubleToByteArr(double param) { byte[] b = ...

    Java中几种常用数据类型之间转换的方法

    Java 中几种常用数据类型之间转换的方法 Java 是一种基于对象的编程语言,它支持多种数据类型之间的转换,这些转换在实际编程...但是,需要注意的是,在进行数据类型转换时,需要考虑到可能出现的精度丢失和溢出问题。

    java数据类型的转换简单数据类型之间的转换 (2). 字符串与其它数据类型的转换 (3). 其它实用数据类型转换

    一些初学JAVA的朋友可能会遇到JAVA的数据类型之间转换的苦恼,例如,整数和float,double型之间的转换,整数和String类型之间的转换,以及处理、显示时间方面的问下面笔者就开发中的一些体会介绍给大家。 我们知道,...

    常见java中数据类型之间的转换.txt

    通过数据类型转换,可以确保不同数据类型之间的兼容性,并满足特定场景下的需求。本文将详细介绍Java中常见的数据类型及其之间的转换方法。 #### 1. `short` 到 `int` **示例代码**: ```java short shortVar = 0;...

    Java中各个数据类型之间的转换

    原始类型包括布尔型(boolean)、字符型(char)、整型(byte、short、int、long)和浮点型(float、double),而引用类型主要指的是对象,如String和Date等。 1. 自动类型转换(隐式转换) 自动类型转换发生在...

    Java数据类型操作包含转换代码实例.rar

    Java的基本数据类型包括整型(byte, short, int, long)、浮点型(float, double)、字符型(char)和布尔型(boolean)。每种类型都有固定的内存大小和取值范围。 1. 整型转换: - 范围较小的数据类型可以自动...

    java基本类型与byte数组互相转换.doc

    Java基本类型是指Java语言中最基本的数据类型,包括byte、short、int、long、float、double、char、boolean等。这些基本类型在内存中以二进制形式存储,而byte数组是Java中的一种数据结构,用于存储一组byte类型的...

    Java基础教程之数据类型

    自动类型转换发生在容量小的数据类型向容量大的数据类型转换时,比如从int转换到long,系统会自动完成转换,无需进行额外的操作。而强制类型转换则需要程序员明确指定转换类型,例如将double类型转换为int类型,需要...

    JAVA数据类型转换.pdf

    具体的变量类型包括布尔型`boolean`、字符型`char`、整型`byte`、`short`、`int`、`long`、浮点型`float`和`double`。此外,`String`和`Date`也是常用的类变量。 #### 三、数据类型转换的种类 Java中的数据类型...

    java 举例分析 equals hashcode 基本类型与基本对象的比较 shot与Short int与Integer long与Long

    举例分析 equals 和 hashcode 方法,hashcode应该怎么样生成 8个基本类型与基本对象的比较:byte与Byte shot与Short int与Integer long与Long float与Float double与Double char与Character

    java之java类型转换

    Java 中的简单类型包括 boolean、byte、char、short、int、long、float、double 和 void 八种类型,每种类型都有其对应的封装器类,如 Boolean、Byte、Character、Short、Integer、Long、Float、Double 和 Void。...

    long 和 int 的相互转换.docx

    原始数据类型包括byte、short、int、long、float、double、char和boolean,而引用数据类型则包括类(class)、接口(interface)和数组。在处理数值计算时,我们可能需要在不同数据类型之间进行转换,特别是当涉及到long...

    java中数据类型转换.doc

    在Java编程语言中,数据类型转换是编程过程中常见的操作,主要涉及基本数据类型之间的转换以及基本数据类型与字符串之间的转换。下面将详细讲解这些转换方式。 1. **基本数据类型的转换** Java中的基本数据类型...

    java基本类型与byte数组互相转换

    在Java编程语言中,基本类型的变量(如`short`、`int`、`long`、`char`、`double`和`float`)和`byte`数组之间的相互转换是一项非常实用的技术,尤其是在网络通信、文件读写等场景下。下面将详细介绍如何进行这些...

    java数据类型转换(20211104012442).pdf

    Java的六个包装类(Boolean、Character、Integer、Long、Float、Double)提供了将简单数据类型转换为类对象的能力,方便进行类型间的转换。通过包装类的构造函数和相关方法,我们可以轻松地在简单类型和其对应的...

    java数据类型转换.pdf

    数值型进一步细分为整型(byte、short、int、long)和浮点型(float、double)。此外,还有特殊的数据类型如字符串(String)和日期(Date),以及对应的包装类,如Boolean、Character、Integer、Long、Float和...

    java代码-1·byte short int 在计算是会自动转化为int 2.float double 为近似值,byte short int 转化时可能会精确丢失 3.把大类型转化小的类型时可能会丢失

    在Java中,有五种整数类型:byte、short、int、long和char。当这些类型之间进行算术运算时,较小的类型(byte、short)会被提升到较大的类型(通常是int)来进行计算。这是Java的隐式类型转换规则之一,确保所有的...

Global site tag (gtag.js) - Google Analytics