package com.eshel.test;
/**
* 进制转换
* @author 郭世文
* @version 1.0
*/
public class HexTransform {
public final int TWO_TYPE = 2;//二进制
public final int EIGHT_TYPE = 8;//八进制
public final int SIXTEEN_TYPE = 16;//十六进制
private final static String TEN = "A";//十六进制中10
private final static String TEN_ADD_ONE = "B";//十六进制中11
private final static String TEN_ADD_TWO = "C";//十六进制中12
private final static String TEN_ADD_THREE = "D";//十六进制中13
private final static String TEN_ADD_FOUR = "E";//十六进制中14
private final static String TEN_ADD_FIVE = "F";//十六进制中15
/**
* <p><blockquote><pre>
整数转换为二进制、八进制、十六进制
46 除数 余数 商
2 0 23
2 1 11
2 1 5
2 1 2
2 0 0
1
计算机 转换: 46--> 101110
55 2 1 27
2 1 13
2 1 6
2 0 3
2 1 1
2 1 0
首先定义String num2 用来接收转换后的二进制
然后定义局部变量 除数t 余数y 商 s
把num的值赋值给商s
使用while(true)循环进行除法并把余数添加到num2末尾
判断商是否为0 如果商为0,再判断余数是否为0,如果余数也为0,则在num2末尾添加一个1,最后break跳出循环
把num2的内容反转然后返回
</blockquote></pre></p>
* @param num 十进制数
* @param type 值为 {@link TWO_TYPE}或{@link EIGHT_TYPE}或{@link SIXTEEN_TYPE }
* @return 返回 result
*/
public static String intTo(int num,int type) {
String result = "";
int t = type;//除数
int y = 0;//余数
int s = num;//商
while(true){
y = s%t;
s /= t;
if(t == 16 && y >=10 ){
String y2 = "";
switch(y){
case 10 :
y2 = TEN;
break;
case 11 :
y2 = TEN_ADD_ONE;
break;
case 12 :
y2 = TEN_ADD_TWO;
break;
case 13 :
y2 = TEN_ADD_THREE;
break;
case 14 :
y2 = TEN_ADD_FOUR;
break;
case 15 :
y2 = TEN_ADD_FIVE;
break;
}
result+=y2;
}else
result+=y;
if(s == 0){
result += y == 0 ? "1" : "";
break;
}
}
result = new StringBuffer(result).reverse().toString();
return result;
}
/**
* <p><blockquote><pre>
二进制、八进制、十六进制转换为整数
46 除数 余数 商
2 0 23
2 1 11
2 1 5
2 1 2
2 0 0
1
101110 因子 元素 结果
2 0*2^0 0
2 1*2 2
2 1*2*2 4
2 1*2*2*2 8
2 0*2*2*2*2 0
2 1*2*2*2*2*2 32
* 0+2+4+8+0+32=46
计算机 转换: 46--> 101110
*首先定义int result 用来接收转换后的十进制
*然后把num反转并赋值给num
*定义numChar 并把num转换为字符数组赋值给 numChar
*然后定义局部变量 因子t 元素 y 结果 r
*使用for(int i = 0;i<numChar.lenght();i++)循环
*
*把numChar[i]转换为整数y = 0 或1
*进行乘法运算 r = y*2^i;
*result+=r;
*
*把result的内容返回
* </blockquote></pre></p>
* 将二进制、八进制、十六进制转换为十进制
* @param num 数值
* @param type 数值进制类型
* @retrurn
*/
public static int ToInt(String num , int type ) {
int result = 0;
num = new StringBuffer(num).reverse().toString();
char[] numChar = num.toCharArray();
int t;
int y;
int r;
for(int i = 0;i<numChar.length;i++){
try {
r = Double.valueOf(Math.pow(type, i)).intValue()*numCharToInt(numChar[i]);
result += r;
} catch (Exception e) {
System.out.println("输入进制有误");
e.printStackTrace();
}
}
return result;
}
/** 二进制转换为十进制、八进制、十六进制
*
* @param num 要转换的数
* @param type 要转换为什么类型
* @return
*/
public static Object binaryTo(String num , int type ) {
if(type != 2){
Object result = null;
result = ToInt(num, 2);
switch(type){
case 8:
result = intTo((Integer)result , 8);
break;
case 16:
result = intTo((Integer)result , 16);
break;
}
return result;
}
return num;
}
/** 十进制、八进制、十六进制转换为二进制
*
* @param num 要转换的数
* @param type 要转换的类型
* @return
*/
public static String toBinary(Object num , int type ){
if(type != 2){
Object result = num;
if(type !=10 ){
result = ToInt(num.toString(), type);
}
return intTo((Integer)result, 2);
}
return num.toString();
}
/** 八进制转换为十六进制
*
* @param num 要转换的数
* @return
*/
public static String EightToSixteen(String num ) {
Object result = null;
result = ToInt(num, 8);
result = intTo((Integer)result, 16);
return result.toString();
}
/** 十六进制转换为八进制
* @param num 要转换的数
* @return
*/
public static String SixteenToEight (String num){
Object result = null;
result = ToInt(num, 16);
result = intTo((Integer)result, 8);
return result.toString();
}
private static int numCharToInt(char charNum) throws Exception {
int num = -1;
char[]charArray = {'0','1','2','3','4','5','6','7','8','9','A','B','C','D','E'};
for(int i=0;i<charArray.length;i++){
if(charArray[i] == charNum)
num = i;
}
if(num == -1){
throw new Exception("charArray[]数组中没有字符charNum");
}else
return num;
}
}
|
|