转:https://zhuanlan.zhihu.com/p/38945098
    https://www.cnblogs.com/summerdata/p/10722144.html

    记牢下面对应
    记牢下面对应
    记牢下面对应
    记牢下面对应

    1 1 1 1 1 1 1 1
    128 64 32 16 8 4 2 1
    2^7 2^6 2^5 2^4 2^3 2^2 2^1 2^0

    十六进制 十进制 二进制
    FF 256 11111111
    80 128 10000000
    7F 127 01111111

    一个数据(字节) = 01010101 (8个状态)用8个二进制数来表示

    byte 8位二进制数
    8位二进制数,太长了,每3位用1个数字表示,用3个8进制数就能表示,每4位用一个数字表示,用2个16进制数就可以表示

    有符号byte 范围 (-128 ~ 127)
    有符号byte 范围 (-128 ~ 127)

    十六进制 (每4位二进制一分隔) 每4位二进制表示1个十六进制数 2^4 = 16,十六进制0 ~ F 的这几个数字,一定能用 8,4,2,1这几个数字组合相加
    八进制 每3位二进制表示1个八进制数 2^3 = 8

    十六进制转二进制,用上边的记牢,但只用了其中 8421 法则,用到了 8 4 2 1 的哪一个相加之和等于该数,该位置就取1,否则取0
    如:F:1111 F对应15=8+4+2+1 ,B对应11=8+2+1,4没有用对应的位置为0, 1011
    FB 结果 11111011,组合即可
    二进制转化为十六进制: 每4位使用 8421法则相加,得到10进制数,最大为15,再表示为十六进制即可
    00101101
    0010 = 2;
    1101 = 8+4+1 = D;所以二进制 0b00101101 = 十六进制0x2D。

    二进制转化为十进制
    如 0b11111111,把对应的数加起来就可以了。
    0b11111111 = 128+64+32+16+8+4+2+1 = 255 看到 255 有没有一种熟悉的感觉?
    所以这时候再给你出道题,把 0b010110 转化成十进制你应该会了吧?
    0b010110 = 16 + 4 + 2 = 22
    这也就是把二进制数按权展开、相加即得十进制数,同样适用于八进制和十六进制转十进制
    12^7 + 12^6 + 12^5 + 02^6 …
    image.png
    image.png
    十进制转化为二进制
    我们要把十进制如22,转为二进制就是:
    22之内16有没有? 那么在16对应的地方就有1。
    22-16=6,那么8对应的就不存在了。
    6之内有4对吧,那么4对应的就有1,6-4=2,那么2也有,2-2=0,所以1就没了。
    所以最后的答案就是 22 = 0b10110。
    还有一种方法,就是十进制数除2取余法,即十进制数除2,余数为权位上的数,得到的商值继续除2,依此步骤继续向下运算直到商为0为止。同样适用于十进制转八进制和十六进制
    image.png
    image.png
    —————————————————————————
    关于Byte 有意思的,上述8421法则
    两位二进制数 最大为 11 表示的整数 3 = 2 + 1 = 2^2 - 1
    三位二进制数 最大为111 表示的整数 7 = 4 +2 +1 = 2^3 - 1
    四位二进制数 最大为1111 表示的整数 15 = 8 + 4 +2 +1 = 2^4 - 1
    以此类推
    七位二进制数 最大为1111111 表示的整数 127 = 64 + 32 + 16 + 8 + 4 +2 +1 = 2^7 - 1
    八位二进制数 最大为11111111 表示的整数 255 = 128 + 64 + 32 + 16 + 8 + 4 +2 +1 = 2^8 - 1

    1个字节是8位二进制数 ,本应表示 最大值为 255 ,但 java byte 类型是有符号整型,最高位是符号位 0为正 1为负,剩余7位为数据,则java byte正数最大表示为127 ,负数为 -128
    ——————————————————————————————————-
    关于Java Byte 的取值范围大家都知道(-128 ~ 127),那么-128 和 127 这两个数是怎么计算的呢?
    概念:负数的补码是该 数 绝 对 值 的 原 码 按 位 取 反 ,然 后 对 整个数 加 1
    在计算机内,定点数有3种表示法:原码、反码和补码
    [原码]就是前面所介绍的二进制定点表示法,即最高位为符号位,“0”表示正,“1”表示负,其余位表示数值的大小。
    [反码]表示法规定:正数的反码与其原码相同;负数的反码是对其原码逐位取反,但符号位除外。
    [补码]表示法规定:正数的补码与其原码相同;负数的补码是在其反码的末位加1。
    Java使 用 补 码 来 表 示 二 进 制 数 ,在 补 码 表 示 中 ,最 高 位 为符号 位 ,正 数 的 符 号 位 为 0,负 数 为 1。
    现在进行java Byte 取值范围分析:
    1、确定byte是1个字节,也就是8位
    2、对于计算机来说,二进制最大的正数是01111111 转换成十进制为:127
    3、最小的负数: 10000000,即-128
    二进制负数的值:取反加一,所以 10000000 的值为:
    1. 取反 -> 01111111 127
    2. 加一 -> 128
    3. 加上符号: -128
    负数的二进制 = 正数(该数的绝对值)的二进制反码 + 1

    例如:-5
    第一步取绝对值:-5 的绝对值:5
    第二步转二进制:5的二进制:0000 0101
    第三步取反码: 0000 0101 的反码 1111 1010
    第四步加一: 1111 1010 加一 1111 1011————————————————

    Java 用Byte存储 255 https://blog.csdn.net/qq_37855749/article/details/115736609
    -128 ~ 127
    0 ~ 255

    -1 -2 … -126 -127 -128
    255 254 … 130 129 128

    byte a= (byte) 255;
    System.out.println(Byte.toUnsignedInt(a));
    或者
    byte a = (_byte) _0xff; //(byte) 255
    System.out.println(a & 0xff);
    结果都是255
    整型0-225 转 十六进制字符串
    Integer.toHexString(buf[i] & 0xFF)
    String.format(“%02X”, b);

    关于BCD码
    采用BCD码,1位十进制数要用4位二进制数表示, 一个字节其有8个二进位位,所以能存放2个BCD码,恰好一个字节可以由2个十六进制数 表示,
    如:字符串 12
    二进制 0001 0010
    十六进制 0x12 (每4位二进制一分隔)
    https://blog.csdn.net/qq_33750826/article/details/53004685
    Java的String数字和BCD码相互转换
    https://blog.csdn.net/o0daxu0o/article/details/120924462
    累加和校验实现方式16进制
    每个字节累加得出整数计算出和,用上面除16取余法,2次,即得到 从低到高 最后2位十六进制,或者用和对256求余再转为16进制,即可

    关于Netty buffer

    java 通过移位的方法做int字节转换
    /
    @author: qzf
    @date: 2022/5/18 14:31
    @describe: byte转无符号整型long(低位在后,高位在前)
    @param:
    @return:
    /
    public static long bytesToLongAhead(byte[] bs) throws Exception {
    int bytes = bs.length;
    if(bytes == 0){
    return 0;
    }
    if(bytes > 1) {
    if((bytes % 2) != 0 || bytes > 8) {
    throw new Exception(“not support”);
    }}
    switch(bytes) {
    case 0:
    return 0;
    case 1:
    return (long)((bs[0] & 0xff));
    case 2:
    return (long)((bs[0] & 0xff) <<8 | (bs[1] & 0xff));
    case 4:
    return (long)((bs[0] & 0xffL) <<24 | (bs[1] & 0xffL) << 16 | (bs[2] & 0xffL) <<8 | (bs[3] & 0xffL));
    case 8:
    return (long)((bs[0] & 0xffL) <<56 | (bs[1] & 0xffL) << 48 | (bs[2] & 0xffL) <<40 | (bs[3] & 0xffL)<<32 |
    (bs[4] & 0xffL) <<24 | (bs[5] & 0xffL) << 16 | (bs[6] & 0xffL) <<8 | (bs[7] & 0xffL));
    default:
    throw new Exception(“not support”);
    }
    //return 0;
    }
    /

    @author: qzf
    @date: 2022/5/18 14:31
    @describe: long无符号整型转byte(低位在后,高位在前)
    @param:
    @return:
    /
    public static byte[] longToBytesAhead(long value,int length) {
    byte[] src = new byte[length];
    if(value == 0){
    return src;
    }
    if(length % 2 != 0){
    return src;
    }
    switch (length){
    case 1:
    src[0] = (byte) (value & 0xFF);
    break;
    case 2:
    src[0] = (byte) ((value >> 8) & 0xFF);
    src[1] = (byte) (value & 0xFF);
    break;
    case 4:
    src[0] = (byte) ((value >> 24) & 0xFF);
    src[1] = (byte) ((value >> 16) & 0xFF);
    src[2] = (byte) ((value >> 8) & 0xFF);
    src[3] = (byte) (value & 0xFF);
    break;
    case 8:
    src[0] = (byte) ((value >> 56) & 0xFF);
    src[1] = (byte) ((value >> 48) & 0xFF);
    src[2] = (byte) ((value >> 40) & 0xFF);
    src[3] = (byte) ((value >> 36) & 0xFF);
    src[4] = (byte) ((value >> 24) & 0xFF);
    src[5] = (byte) ((value >> 16) & 0xFF);
    src[6] = (byte) ((value >> 8) & 0xFF);
    src[7] = (byte) (value & 0xFF);
    break;
    }

    1. return src;<br /> }