java中的byte[]和其他数据类型转换问题

原创 2016年08月09日 15:06:55

最近在接手了java的数据通信,由于是别人做了一半的,所以各种分工不同步、未测试而遗留的bug是一个接着一个。经过两周的努力,总算是把各种问题、功能都调教好了。趁此,做个基本类型与byte[]的转换。


public class Conclude {
	/**
	 * 测试类
	 * @param args
	 */
	public static void main(String[] args) {
		double test = -0.123;
		System.out.println(Conclude.doubleToBytes(test));
		System.out.println(Conclude.bytesToDouble(Conclude.doubleToBytes(test)));
	}

	public static byte[] longToBytes(long num) {
		long temp = num;
		byte[] b = new byte[8];
		for (int i = 0; i < b.length; i++) {
			b[i] = new Long(temp & 0xff).byteValue();
			temp = temp >> 8;
		}
		return b;
	}
	/**
	 * @param 设b的长度为8
	 * @return
	 */
	public static long bytesToLong(byte[] b) {
		long num = 0;
		long temp = 0;
		for (int i = 0; i < b.length; i++) {
			temp = b[i] & 0xff;
			temp <<= 8 * i;
			num = num | temp;// 此处或的效果和加是相同的,但是或操作的效率要高一些
		}
		return num;
	}

	public static byte[] intToBytes(int num) {
		int temp = num;
		byte[] b = new byte[4];
		for (int i = 0; i < b.length; i++) {
			b[i] = new Integer(temp & 0xff).byteValue();
			temp = temp >> 8;
		}
		return b;
	}

	/**
	 * @param 设byte的长度为4
	 * @return
	 */
	public static int bytesToInt(byte[] b) {
		int num = 0;
		int temp = 0;
		for (int i = 0; i < b.length; i++) {
			temp = b[i] & 0xff;
			temp <<= 8 * i;
			num = num | temp;
		}
		return num;
	}

	public static byte[] doubleToBytes(double d) {
		byte b[] = new byte[8];
		// 根据 IEEE 754 浮点双精度格式 ("double format") 位布局,返回指定浮点值的表示形式
		long v = Double.doubleToLongBits(d);
		b[0] = (byte) (v >>> 56);// 发现写死的话比for循环效率高那么一丢丢。。。
		b[1] = (byte) (v >>> 48);
		b[2] = (byte) (v >>> 40);
		b[3] = (byte) (v >>> 32);
		b[4] = (byte) (v >>> 24);
		b[5] = (byte) (v >>> 16);
		b[6] = (byte) (v >>> 8);
		b[7] = (byte) (v >>> 0);
		return b;

	}

	public static double bytesToDouble(byte[] b) {
		return Double.longBitsToDouble((((long) b[0] << 56) + ((long) (b[1] & 0xff) << 48)
				+ ((long) (b[2] & 0xff) << 40) + ((long) (b[3] & 0xff) << 32) + ((long) (b[4] & 0xff) << 24)
				+ ((b[5] & 0xff) << 16) + ((b[6] & 0xff) << 8) + ((b[7] & 0xff) << 0)));
	}
}

会做这个总结,是因为数据的通信经常用byte即8bit为单位进行数据的传输。而接收和发送数据,就需要数据进行编码解码。以上代码采用的是一般使用的byte[]和其他数据类型的转换。当然,也可以自己定规则喽,但是这个是最实用的,貌似jdk中也用的这种转换方式。


Java byte数据类型详解

(转载) Java代码   public static String bytes2HexString(byte[] b) {       String ret = "";...
  • u010746364
  • u010746364
  • 2016年01月21日 10:28
  • 2578

Java byte数据类型转换

public class DataTypeChangeHelper { /** * 将一个单字节的byte转换成32位的int * * @param b * ...
  • yang_734664103
  • yang_734664103
  • 2014年04月08日 11:45
  • 1633

java中的byte类型的取值范围是-128~127

概念:负数的补码是该 数 绝 对 值 的 原 码 按 位 取 反 ,然 后 对 整个数 加 1 步骤: 1.确定byte是1个字节,也就是8位 2.最大的应该是0111 1111,因...
  • aoerqileng
  • aoerqileng
  • 2014年11月20日 11:27
  • 2113

Java 从流中读取byte的奇怪现象,出现负值,详解

其实一点都不奇怪,下面我们来详细分析 首先看下面一段代码,代码的意思是将128写入到文件中,再从文件中读出一个byte输出 File f = new File("f1"); Fil...
  • xingtanzjr
  • xingtanzjr
  • 2016年03月15日 17:13
  • 3574

JAVA 对象 & byte数组之间转化

JAVA 对象 & Byte数组之间转化示例
  • pistolove
  • pistolove
  • 2016年12月27日 18:09
  • 5058

JAVA 字节顺序转换

Java代码   /**  * 通信格式转换  *  * Java和一些windows编程语言如c、c++、delphi所写的网络程序进行通讯时,需要进行相应的转换  * 高、低字节之间的转换 ...
  • hetangbian
  • hetangbian
  • 2015年02月10日 10:40
  • 1695

java空格分隔的字符串表示的十六进制数转换为byte数组

java空格分隔的字符串表示的十六进制数转换为byte数组 用到这样的转换,搜索几个但还没有准备表达自己的需求.就自己花了点时间写了出来. 里面没有错误检查的.只是简单的功能的实现. /...
  • thanklife
  • thanklife
  • 2013年11月30日 12:20
  • 3548

java 如何将byte中的有效长度转换为String

java 如何将byte中的有效长度转换为String
  • educast
  • educast
  • 2016年11月01日 10:35
  • 1168

Java中byte类型变量做& 0xff运算的理解

Java中byte类型变量做& 0xff运算的理解 在IO字符操作或加密计算时经常会见到byte值与0xff做与运算,这种写法首次看到会有些不解,其实也比较容易理解。下面说下我个人的理解...
  • Deveper
  • Deveper
  • 2016年09月02日 13:01
  • 957

Java数据类型之byte、char

Java 有8中基本数据类型,分别是byte、int、long、char、float、double、boolean。 1.byte、char的简单介绍 有时候总是搞不清byte、char,所以就现在好...
  • yulei_qq
  • yulei_qq
  • 2013年09月07日 09:57
  • 35086
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:java中的byte[]和其他数据类型转换问题
举报原因:
原因补充:

(最多只允许输入30个字)