进制转换随手记

进制和二进制位数的关系

8进制和3个二进制位

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

16进制和4个二进制位

4个2进制位可以表示1位16进制数,因为0000~1111=0~F
16进制是满15进1,4个bit最大值是1111=15,一个字节可以表示两个16进制数,可以把一个字节看成高四位和低四位
一个byte=1个字节=8位=高四位|低四位
2进制和16进制的转换同8进制转换方式

BCD码和4个二进制位

BCD码是2进制和10进制相互转换的编码格式,BCD码是用四位2进制表示一个10进制中的数字
BCD码分有权码和无权码
有权码分为:8421、2421、5421
无权码:余3码

8421码

BCD码是8421码,是指用4个bit表示一个0~9的十进制数,最大值是1001=9

8进制、10进制和16进制转换

各进制都是满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的字符和ascii不同

java的一个char是两个字节,char c = ‘7’,(byte)c = 55,而不是7,55是ascii码中的,减去48才是数字7

public class DataUtil {

    /**
     * 方法:字节转BCD编码字符串
     * <p>
     * BCD编码:
     * BCD码是2进制和10进制相互转换的编码格式,BCD码是用四位2进制表示一个10进制中的数字
     * BCD码分有权码和无权码
     * 有权码分为:8421、2421、5421
     * 无权码:余3码
     * <p>
     * 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});
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值