二进制十六进制相互转换
程序员文章站
2024-03-16 22:52:16
...
使用Java自带的转换方法也可以但是会有如下情况发生:
Integer.toBinaryString(Integer.valueOf("0020",16))。---java自封装的方法
- 如果十六进制为“0020”类似这种的情况就会转换为100000,有0的则不会转换。
- 十六进制很长的时候就会出错,因为通过这样的转换,在把字符串转成整形的时候,长度太长了,超过的整形的最大值,。
于是便有了如下代码
public class BinaryConversion {
private static String hexStr = "0123456789ABCDEF";
private static String[] binaryArray =
{"0000","0001","0010","0011",
"0100","0101","0110","0111",
"1000","1001","1010","1011",
"1100","1101","1110","1111"};
/**
*
* @param str
* @return 二进制数组转换为二进制字符串 2-2
*/
public static String bytes2BinStr(byte[] bArray){
String outStr = "";
int pos = 0;
for(byte b:bArray){
//高四位
pos = (b&0xF0)>>4;
outStr+=binaryArray[pos];
//低四位
pos=b&0x0F;
outStr+=binaryArray[pos];
}
return outStr;
}
/**
*
* @param bytes
* @return 将二进制数组转换为十六进制字符串 2-16
*/
public static String bin2HexStr(byte[] bytes){
String result = "";
String hex = "";
for(int i=0;i<bytes.length;i++){
//字节高4位
hex = String.valueOf(hexStr.charAt((bytes[i]&0xF0)>>4));
//字节低4位
hex += String.valueOf(hexStr.charAt(bytes[i]&0x0F));
result +=hex; //+" "
}
return result;
}
/**
*
* @param hexString
* @return 将十六进制转换为二进制字节数组 16-2
*/
public static byte[] hexStr2BinArr(String hexString){
//hexString的长度对2取整,作为bytes的长度
int len = hexString.length()/2;
byte[] bytes = new byte[len];
byte high = 0;//字节高四位
byte low = 0;//字节低四位
for(int i=0;i<len;i++){
//右移四位得到高位
high = (byte)((hexStr.indexOf(hexString.charAt(2*i)))<<4);
low = (byte)hexStr.indexOf(hexString.charAt(2*i+1));
bytes[i] = (byte) (high|low);//高地位做或运算
}
return bytes;
}
/**
*
* @param hexString
* @return 将十六进制转换为二进制字符串 16-2
*/
public static String hexStr2BinStr(String hexString){
return bytes2BinStr(hexStr2BinArr(hexString));
}
}
思路:
1、二进制字节转十六进制时,将字节高位与0xF0做"&"操作,然后再左移4位,得到字节高位的十六进制A;将字节低位与0x0F做"&"操作,得到低位的十六进制B,将两个十六进制数拼装到一块AB就是该字节的十六进制表示。
2、十六进制转二进制字节时,将十六进制字符对应的十进制数字右移动4为,得到字节高位A;将字节低位的十六进制字符对应的十进制数字B与A做"|"运算,即可得到十六进制的二进制字节表示
参考:
上一篇: javascript实现A*寻路算法
下一篇: 【五子棋-简易AI】