在实际的开发过程中遇到过这样一个问题:网络的数据传输,为了数据量的小,会把几个字段拼在一起合并成几个字节。
比如我遇到的是,时标合并:日、时、分、秒,这四个字段要求在传输的过程中占3个字节,也就是每个字段占了6位。
我在开发的过程中是先把每一个字段值转成二进制数,位数不够的高位补0,因为设计的时候就已经考虑到,在特殊字段转换中不会超过6位。60—–>111100。
最后我把所有的都拼接成了一个字符串:“010100001101111001011001”,这样的一个24位。3字节数据。然后就需要将这个字符串转成想要的byte数据。做到这突然不知道该怎么做了。然后*大家都知道有一个“进制转换-在线工具”,好奇他的底层代码是怎么实现,SO~~~~
public static void main(String[] args) {
int n = 18;
Integer.toHexString(n);
System.out.println(n + "的二进制是:" + Integer.toBinaryString(n));
System.out.println(n + "的八进制是:" + Integer.toOctalString(n));
System.out.println(n + "的十六进制是:" + Integer.toHexString(n));
System.out.println(n + "的三进制是:" + Integer.toString(n, 3));
}
//下面是r进制转10进制
//r进制转10进制 方法
//radix进制的字符串s转10进制 Integer.parseInt((String) s,(int) radix);
public class Main {
public static void main(String[] args) {
String s = "10101";//1+4+16==21
System.out.println(Integer.parseInt(s,2));//结果是21
}
}
重点代码:任意进制之间的转换(不是啦~~~)
package test;
import java.util.Stack;
/****
* 数字工具,进行42以下的任意进制转换
* @author wp
*/
public class NumericalUtil {
private static final String C_CODES_STRING = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ!@#$.`";
/***
* 将10进制转换为任意进制
* @param intVal
* @param base <=42
* @return
*/
public static String int2CodeString(long intVal,int base) {
int w_code_len = C_CODES_STRING.length();
if (base >w_code_len){
return null;
}
StringBuilder sb = new StringBuilder();
Stack<String> s=new Stack<String>();
while (intVal!=0){
s.push(C_CODES_STRING.charAt((int)(intVal%base))+"");
intVal/=base;
}
while (!s.empty()){
sb.append(s.pop());
}
return sb.length()==0?"0":sb.toString();
}
/***
* 任何进制转换,
* @param s
* @param srcBase s的进制
* @param destBase 要转换为的进制
* @return
*/
public static String BaseConvert(String s,int srcBase,int destBase){
if(srcBase == destBase){
return s;
}
char[] chars = s.toCharArray();
int len = chars.length;
if(destBase != 10){//目标进制不是十进制 先转化为十进制
s = BaseConvert(s,srcBase,10);
}else{
long n = 0;
for(int i = len - 1; i >=0; i--){
n+=C_CODES_STRING.indexOf(chars[i])*Math.pow(srcBase, len - i - 1);
}
return String.valueOf(n);
}
return int2CodeString(Integer.valueOf(s),destBase);
}
public static void main(String[] args) {
// String str=BaseConvert("010100001101111001011001",2,16);
String str=BaseConvert("20",10,16);
System.out.println(str);
}
}