byte[] b = new byte[2];
b[0] = -12;
byte 1个字节
char 2个字节
short 2个字节
int 4个字节
long 8个字节
float 4个字节
double 8个字节
计算机存储数据机制:正数存储的二进制原码,负数存储的是二进制的补码。 补码是负数的绝对值反码加1。
比如-12,-12 的绝对值原码是:0000 1100 取反: 1111 0011 加1: 1111 0100
byte --> int 就是由8位变 32 位 高24位全部补1: 1111 1111 1111 1111 1111 1111 1111 0100 ;
0xFF 是计算机十六进制的表示: 0x就是代表十六进制,A B C D E F 分别代表10 11 12 13 14 15 F就是15 一个F 代表4位二进制:可以看做 是 8 4 2 1。
0xFF的二进制表示就是:1111 1111。 高24位补0:0000 0000 0000 0000 0000 0000 1111 1111;
-12的补码与0xFF 进行与(&)操作 最后就是0000 0000 0000 0000 0000 0000 1111 0100
转换为十进制就是 244。
/**
* 将字节数组转换为16进制字符串
* @param bytes
* @return
*/
public static String binaryToHexString(byte[] bytes) {
if (bytes == null || bytes.length == 0) return "";
String hexStr = "0123456789ABCDEF";
StringBuilder result = new StringBuilder("");
String hex = "";
for (byte b : bytes) {
hex = String.valueOf(hexStr.charAt((b & 0xF0) >> 4));
hex += String.valueOf(hexStr.charAt(b & 0x0F));
result.append(hex);
//result += hex + " ";//可加空格分割
}
return result.toString();
}
/**
* 将一组十六进制字符转换成字节数组
* @param hexString
* @return
*/
public static byte[] hexStringToBytes(String hexString) {
if (hexString == null || hexString.equals("")) {
return null;
}
// toUpperCase将字符串中的所有字符转换为大写
hexString = hexString.toUpperCase();
int length = hexString.length() / 2;
// toCharArray将此字符串转换为一个新的字符数组。
char[] hexChars = hexString.toCharArray();
byte[] d = new byte[length];
for (int i = 0; i < length; i++) {
int pos = i * 2;
d[i] = (byte) (charToByte(hexChars[pos]) << 4 | charToByte(hexChars[pos + 1]));
}
return d;
}
/**
* 返回在指定字符的第一个发生的字符串中的索引,即返回匹配字符
* @param c
* @return
*/
private static byte charToByte(char c) {
return (byte) "0123456789ABCDEF".indexOf(c);
}
个人收藏仅供个人参考