博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Java I/O : Java中的进制详解
阅读量:5795 次
发布时间:2019-06-18

本文共 3204 字,大约阅读时间需要 10 分钟。

作者:

上一篇,泥瓦匠基础地讲了下。这一讲,泥瓦匠带你走进Java中的进制详解。

一、引子

在Java世界里,99%的工作都是处理这高层。那么二进制,字节码这些会在哪里用到呢?

自问自答:在跨平台的时候,就凸显神功了。比如说文件读写数据通信,还有Java编译后的字节码文件。下面会有个数据通信的例子哦。

Java对对象实现Serializablle接口,就可以将其转化为一系列字节,而在通信中,不必要关系数据如何在不同机器表示和字节的顺序。这里泥瓦匠对Serializablle接口,不做详细讲解,以后单独详解。

 

二、Java进制转换

首先认识下Java中的数据类型

1、Int整型:byte(8位,-128~127)、short(16位)、int(32位)、long(64位)

2、Float型:float(32位)、double(64位)

2、char字符:unicode字符(16位)

也就是说,一个int等价于长度为4的字节数组。

J

package javaBasic.oi.byteoper;public class IntegerOper{	public static void main(String[] args)	{		System.out.println("17的十六进制: " + Integer.toHexString(17));		System.out.println("17的八进制:     " 	+ Integer.toOctalString(17));		System.out.println("17的二进制:     " 	+ Integer.toBinaryString(17));		System.out.println(Integer.valueOf("11", 16));		System.out.println(Integer.valueOf("21", 8));		System.out.println(Integer.valueOf("00010001", 2));	}}

右键Run一下,我们可以在控制台中看到如下输出:

17的十六进制: 1117的八进制:   2117的二进制:   10001171717

补充:如果值太大,则需要调用 java.lang.Long 提供的方法。

 

三、Java基本类型和字节神奇转换

这里泥瓦匠想到了自己是个学生,典型的OO思想。那学号:1206010035是整型,怎么转成字节呢,上面说的拥有字节码的对象能通信。所以,学校关于学号这个都是这样的方式通信的。因此,要将学号转成字节码才行。

泥瓦匠就写了个工具类 IntegerConvert.java:

package javaBasic.oi.byteoper;public class IntegerConvert{	/**	 * Int转字节数组	 */	public static byte[] int2Bytes(int inta)	{		// 32位Int可存于长度为4的字节数组 		byte[] bytes = new byte[4];		for (int i = 0; i < bytes.length; i++)			bytes[i] = (byte)(int)((inta >> i * 8) & 0xff);// 移位和清零				return bytes;	}		/**	 * 字节数组转Int	 */	public static int bytes2Int(byte[] bytes)	{		int inta = 0;		for (int i = 0; i < bytes.length; i++)			inta += (int)((bytes[i] & 0xff) << i * 8);// 移位和清零				return inta;	}		public static void main(String[] args)	{		// 将我的学号转换成字节码		byte[] bytes = IntegerConvert.int2Bytes(1206010035);		System.out.println(bytes[0] + " " + bytes[1] + " " + bytes[2] + " " + bytes[3]);		// 字节码就可以转换回学号		System.out.println(IntegerConvert.bytes2Int(bytes));	}}

跑一下,右键Run,可以看到以下输出:

-77 64 -30 711206010035

代码详细解释如下:

1、(inta >> i * 8) & 0xff

移位 清零从左往右,按8位获取1字节

2、这里使用的是小端法。地位字节放在内存低地址端,即该值的起始地址。补充:32位中分大端模式(PPC)和小段端模式(x86)。

 

自然,Long也有其转换方法,如下:

public class LongConvert{	/**	 * long 转 byte数组	 */	public static byte[] long2Bytes(long longa)	{		byte[] bytes = new byte[8];		for (int i = 0; i < bytes.length; i++)			bytes[i] = (byte)(long)(((longa) >> i * 8) & 0xff); // 移位和清零				return bytes;	}		/**	 * byte数组 转 long	 */	public static long bytes2Long(byte[] bytes)	{		long longa = 0;		for (int i = 0; i < bytes.length; i++)			longa += (long)((bytes[i] & 0xff) << i * 8); // 移位和清零				return longa;	}	}

 

那字符串,字符数组呢?比如泥瓦匠的名字:李强强

Java也提供了一系列的方法,其实 java.lang.String 封装了char[],其中本质还是对char数组的操作。代码如下:

package javaBasic.oi.byteoper;public class StringConvert{	public static void main(String[] args)	{		String str = "李强强";		byte[] bytes = str.getBytes();		// 打印字节数组		System.out.println("'李强强'的字节数组为:");		for (int i = 0; i < bytes.length; i++)			System.out.print("\t" + bytes[i]);	}}

右键Run一下,可以看到以下输出:

'李强强'的字节数组为:	-64	-18	-57	-65	-57	-65

论证:这里我们论证了一个中文,需要两个字节表示,也就是说一个中文是16位

 

四、浅谈Java通信中的数据

1、对象实现Serializable接口。

实现了Serializable接口的对象,可将它们转换成一系列字节,并可在以后完全恢复回原来的样子。

2、其学号属性值 1206010035,由客户端转换为字节码。

3、字节码传输至服务端

4、服务端接收并转换为对象属性值。

五、总结

此文讲的点有点多,泥瓦匠就想把这块用到的知识点串起来,然后慢慢每个讲解。总结如下:

1、Java中进制转换是什么?

2、Java中进制转换的作用?

转载地址:http://dtdfx.baihongyu.com/

你可能感兴趣的文章
在一个免费操作系统为王的时代,Windows 10还能独善其身吗?
查看>>
26亿美元收购Avnet IT业务Tech Data股价猛涨21%
查看>>
2022年IoT芯片市场规模超100亿
查看>>
传统通信方式急需改变,Twilio 推出了可编程传真技术
查看>>
1+1<2 超融合只为超简单
查看>>
从华为起诉三星 看中国知识产权建设
查看>>
CRM是未来公司的中心
查看>>
借大数据推动交易平台信息化
查看>>
河北保定力建“智慧城市”主城区免费WiFi覆盖
查看>>
赋能未来的昆腾全新Scalar存储平台
查看>>
“P2P已死”亦或“断臂重生”
查看>>
爱立信利用弹性RAN助力软银将东京火车站数据速率提升40%
查看>>
SAP成立新基金SAP.iO,用数千万美元投资使用SAP资源研发产品的创业公司
查看>>
信息泄露事件频发 快递行业的隐私面单之战
查看>>
上海服务外包中心设立全球第四个分中心
查看>>
浅析各国大数据审计工作现状
查看>>
智慧酒店浪潮迭起 智驿共享多重盈利法则
查看>>
神华15亿投薄膜太阳能:奇葩买卖or布局未来?
查看>>
爱立信完成印尼首次5G演示
查看>>
在巨大的体量面前 华为是如何保持高效的战斗力的?
查看>>