前言
本篇将讲解Java中JDK内置的进制转换以及在Java中,数据类型之间的转换机制和过程。
图片、部分源程序源自慕课网。
一、Java中JDK内置的进制转换
注:其中的‘其他进制转换成十进制’,还有其他方法,如下所示:
Integer.parseInt(“0101”, 2) // 二进制转换成十进制
Integer.parseInt(“376”, 8) // 八进制转换成十进制
Integer.parseInt(“FFFF”, 16) // 十六进制转换成十进制
将‘其他进制转换成十进制’有两种方法,其区别如下:
- Integer.valueOf(String s, int radix)
1)这个方法实际上是将以其他进制形式表示的字符串转换成Integer类型的包装类。
2)其后面可以加上‘.toString()’方法将其转换成字符串。
3)当然,就算没有加上‘.toString()’方法,java内置系统也会默认帮你转换。
4)因此在下面可以看到有加和没加‘.toString()’方法,输出的结果都一样。- Integer.parseInt(String s, int radix)
1)这个方法实际上是将以其他进制形式表示的字符串转换成int类型的数据。
2)其后面不允许加上‘.toString()’方法,因为转换后的数据仅仅是一个int类型的数据,并非对象。
3)因此也就不可能调用‘.toString()’方法了。
代码如下:
public class RadixMain {
public static void main(String[] args) {
// TODO Auto-generated method stub
// 十进制转为其他进制
System.out.println(Integer.toBinaryString(5201314)); // 二进制
System.out.println(Integer.toHexString(5201314)); // 十六进制
System.out.println(Integer.toOctalString(5201314)); // 八进制
System.out.println("------------------这是一条分隔符-----------------");
// 其他进制转换为十进制
/**
* 注:在此可用两种方法将其他进制转换成十进制:
* 1、Integer.valueOf(String s, int radix)
* 这个方法实际上是将以其他进制形式表示的字符串转换成Integer类型的包装类
* 其后面可以加上‘.toString()’方法将其转换成字符串
* 当然,就算没有加上‘.toString()’方法,java内置系统也会默认帮你转换
* 因此在下面可以看到有加和没加‘.toString()’方法,输出的结果都一样
* 2、Integer.parseInt(String s, int radix)
* 这个方法实际上是将以其他进制形式表示的字符串转换成int类型的数据
* 其后面不允许加上‘.toString()’方法,因为转换后的数据仅仅是一个int类型的数据,并非对象
* 因此也就不可能调用‘.toString()’方法了。
*/
System.out.println(Integer.valueOf("0101", 2).toString()); // 二进制转换为十进制
System.out.println(Integer.valueOf("0101", 2)); // 二进制转换为十进制
// System.out.println(Integer.parseInt("0101", 2).toString()); // 二进制转换为十进制
System.out.println(Integer.parseInt("0101", 2)); // 二进制转换为十进制
System.out.println(Integer.valueOf("520", 8)); // 八进制转换为十进制
System.out.println(Integer.valueOf("FD", 16)); // 十六进制转换为十进制
}
}
运行结果:
二、Java中的进制
-
Java中的二进制在跨平台中用的比较多,如:‘文件读写’、‘数据通信’等。
-
Java中的数据类型如下:
1)基本数据类型有四种:
int数据类型:byte(8bit, -128~127)、short(16bit)、int(32bit)、long(64bit)
float数据类型:单精度(32bit float)、双精度(64bit double)
boolean类型变量的取值有:true、false
char数据类型有:unicode字符,16位
2)对应的包装类如下:
Integer、Float、Boolean、Character、Double、Short、Byte、Long
-
整型数据转化为字节
例:8143(0000 0000 0000 0000 0001 1111 1100 1111)
=> byte [] b = [-49, 31, 0, 0]
从右向左数:
第一个字节:8143 >> 0*8 & 0xff = (1100 1111) = 207(或有符号-49)
第二个字节:8143 >> 1*8 & 0xff = (0001 1111) = 31
第三个字节:8143 >> 2*8 & 0xff = (0000 0000) = 0
第四个字节:8143 >> 3*8 & 0xff = (0000 0000) = 0 -
字符串与字节数组之间的相互转换
1)字符串 —> 字节数组:String s; byte[] bs = s.getBytes();
2)字符数组 —> 字符串:
byte[] bs = new byte[int];
String s = new String(bs); 或 String s = new String(bs, encode); // encode指的是编码方式
- 源程序如下:
package com.radix.byteoperate;
public class Convert {
/**
* int型数据转化为 byte[]型数据
* @param id
* @return
*/
public static byte[] int2Bytes(int id){
byte[] arr = new byte[4];
/**
* 注:将int型变量转换成byte[]数组存储进内存中的步骤如下:
* 1、把变量id的值左移‘0*8’之后,将其强制转换为int型
* 2、接着再与‘0xff’进行与运算
* 3、然后再将两者进行与运算得到的值强制转换成byte型
* 4、最后再将其赋值给arr[0],即:arr[]数组的第一个元素
*/
// arr[0] = (byte)((int)(id >> 0*8) & 0xff);
// arr[1] = (byte)((int)(id >> 1*8) & 0xff);
// arr[2] = (byte)((int)(id >> 2*8) & 0xff);
// arr[3] = (byte)((int)(id >> 3*8) & 0xff);
// 将其改装成for循环的形式, 更加通用一些
for(int i = 0; i < arr.length; i++){
arr[i] = (byte)((int)(id >> i*8) & 0xff);
}
return arr;
}
/**
* byte[]型数据转换成int型数据
*/
public static int bytes2Int(byte[] arr){
/**
* 根据arr数组的每一个字节来得到与之相对应的整数
* 再将其相加,即可将byte[]型数据转换成int型数据
* 其步骤如下:
* 1、将byte[]型数据逐个与‘0xff’进行与运算操作
* 2、接着将两者进行与运算后得到的值进行左移‘i*8’的操作
* 3、然后将左移后的值强制转换成int型数据
* 4、最后再将int型数据赋值给变量deci(i代表变化的整数值)
*/
// int dec0 = (int)((arr[0] & 0xff) << 0*8);
// int dec1 = (int)((arr[1] & 0xff) << 1*8);
// int dec2 = (int)((arr[2] & 0xff) << 2*8);
// int dec3 = (int)((arr[3] & 0xff) << 3*8);
// 将其改装成for循环的形式, 更加通用一些
int result = 0;
for(int i = 0; i < arr.length; i++){
result += (int)((arr[i] & 0xff) << i*8);
}
// return dec0 + dec1 + dec2 + dec3;
return result;
}
/**
* long型数据转化为 byte[]型数据
* @param id
* @return
*/
public static byte[] long2Bytes(long id){
byte[] arr = new byte[8];
/**
* 注:将int型变量转换成byte[]数组存储进内存中的步骤如下:
* 1、把变量id的值左移‘0*8’之后,将其强制转换为int型
* 2、接着再与‘0xff’进行与运算
* 3、然后再将两者进行与运算得到的值强制转换成byte型
* 4、最后再将其赋值给arr[0],即:arr[]数组的第一个元素
*/
// arr[0] = (byte)((int)(id >> 0*8) & 0xff);
// arr[1] = (byte)((int)(id >> 1*8) & 0xff);
// arr[2] = (byte)((int)(id >> 2*8) & 0xff);
// arr[3] = (byte)((int)(id >> 3*8) & 0xff);
// 将其改装成for循环的形式, 更加通用一些
for(int i = 0; i < arr.length; i++){
arr[i] = (byte)((int)(id >> i*8) & 0xff);
}
return arr;
}
/**
* byte[]型数据转换成long型数据
*/
public static long bytes2Long(byte[] arr){
/**
* 根据arr数组的每一个字节来得到与之相对应的整数
* 再将其相加,即可将byte[]型数据转换成int型数据
* 其步骤如下:
* 1、将byte[]型数据逐个与‘0xff’进行与运算操作
* 2、接着将两者进行与运算后得到的值进行左移‘i*8’的操作
* 3、然后将左移后的值强制转换成int型数据
* 4、最后再将int型数据赋值给变量deci(i代表变化的整数值)
*/
// int dec0 = (int)((arr[0] & 0xff) << 0*8);
// int dec1 = (int)((arr[1] & 0xff) << 1*8);
// int dec2 = (int)((arr[2] & 0xff) << 2*8);
// int dec3 = (int)((arr[3] & 0xff) << 3*8);
// 将其改装成for循环的形式, 更加通用一些
long result = 0;
for(int i = 0; i < arr.length; i++){
result += (long)((arr[i] & 0xff) << i*8);
}
// return dec0 + dec1 + dec2 + dec3;
return result;
}
/**
*
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
// 由于‘int2Bytes()’为静态方法,因此可以通过类名直接调用
byte[] arr = Convert.int2Bytes(8143);
// 可以看到控制台中输出的结果为:-49,31,0,0
System.out.println(arr[0] + "," + arr[1] + "," + arr[2] + "," + arr[3]);
System.out.println(Convert.bytes2Int(arr));
// 字符串与字符数组之间的转换
String message = "你好,欢迎来到java的世界!";
byte[] stringToByte = message.getBytes();
String byteToString = new String(stringToByte);
System.out.println(byteToString);
}
}
- 运行结果: