3个2进制位可以表示1位8进制数,因为000~111=0~7,当一个8进制数转2进制时,只需要把每一位8进制数转成三位2进制数即可,即三位2进制数为1组;
当2进制数据转8进制时,整数部分以小数点左侧开始,每三位一组,不足时前补零,小数部分以小数点右侧开始,每三位一组,不足时后补零。
例如:
236.25Q=010 011 110.010 101B=10011110.010101B
10110101.0101011B= 010 110 101.010 101 100B=265.254Q
4个2进制位可以表示1位16进制数,因为0000~1111=0~F
16进制是满15进1,4个bit最大值是1111=15,一个字节可以表示两个16进制数,可以把一个字节看成高四位和低四位
一个byte=1个字节=8位=高四位|低四位
2进制和16进制的转换同8进制转换方式
BCD码是2进制和10进制相互转换的编码格式,BCD码是用四位2进制表示一个10进制中的数字
BCD码分有权码和无权码
有权码分为:8421、2421、5421
无权码:余3码
BCD码是8421码,是指用4个bit表示一个0~9的十进制数,最大值是1001=9
各进制都是满n进1,例如:
16进制,F+1=1111+0001=10000,每4位看成1位16进制数,那么10000=0001 0000=10,10中的高位表示16的1次幂
8进制,7+1=111+001=1000,每3位看成1位8进制数,那么1000=001 000=10,10中的高位表示8的1次幂
8进制和16进制如何转换呢?
可以先把8进制转成2进制,再由2进制转换16进制,也就是1:3转换再由4:1转换
2进制和10进制在转换的过程中,会存在精度丢失的情况,所以通常用8进制或16进制来表示2进制数据。
java的一个char是两个字节,char c = ‘7’,(byte)c = 55,而不是7,55是ascii码中的,减去48才是数字7
public class DataUtil {
/**
* 方法:字节转BCD编码字符串
*
* BCD编码:
* BCD码是2进制和10进制相互转换的编码格式,BCD码是用四位2进制表示一个10进制中的数字
* BCD码分有权码和无权码
* 有权码分为:8421、2421、5421
* 无权码:余3码
*
* 8421码:
* 是指用4个bit表示一个0~9的十进制数,二进制0000~1001即8421的取值范围,1010~1111在8421码中是无意义的。
* 如果两个8421码相加的和大于1001,那么就要+6进行修正,向高位进位!
* 例如:9+1=1001+0001,如果直接相加得出的结果1010,1010不在8421编码范围,因此要+6修正,即:1010+0110=0001 0000
*
* @param bytes 例:[0, 0, 0, 0, 34, 0, 0, 0, 0, 2]
* @return 例:00000000220000000002
*/
public static String toBCD(byte[] bytes) {
// 1个字节两个bcd数
StringBuffer temp = new StringBuffer(bytes.length * 2);
// 每个字节分高四位和第四位存储为字符串
for (int i = 0; i < bytes.length; i++) {
// 如:一个字节的34的二进制表示:10 0010,高四位10=2,第四位0010=2,最后结果为22
temp.append((byte) ((bytes[i] & 0xf0) >>> 4));
temp.append((byte) (bytes[i] & 0x0f));
}
return temp.toString();
}
/**
* 方法:大端模式,字节转无符号数
* 注:数据的长度必须在8字节以内,long类型会出现超出范围的情况
* 实际上可以通过Netty的ByteBuffer去计算
*
* @param bytes
* @return
*/
public static long toLong(byte[] bytes) {
int size = bytes.length;
long t = 0;
int index = 0;
int limit = size;
do {
size--;
if (size == 0) {
t = t | (bytes[index] & 0xFF);
} else {
t = t | ((bytes[index] & 0xff) << (8 * size));
}
index++;
} while (size > 0 && index < limit);
return t;
}
public static void main(String[] args) {
toBCD(new byte[]{0, 0, 0, 0, 34, 0, 0, 0, 0, 2});
}
}