• Java bytesToHexString 解析


    一.代码

        /**
         * Convert byte[] to hex string
         *
         * @param src byte[] data
         * @return hex string
         */
        public static String bytesToHexString(byte[] src){
            StringBuilder stringBuilder = new StringBuilder("");
            if (src == null || src.length <= 0) {
                return null;
            }
            for (int i = 0; i < src.length; i++) {
                int v = src[i] & 0xFF;
                String hv = Integer.toHexString(v);
                if (hv.length() < 2) {
                    stringBuilder.append(0);
                }
                stringBuilder.append(hv);
            }
            return stringBuilder.toString();
        }

    二.解析

        /**
         * 补码
         */
        public static void complement(){
            byte a=-1;
            System.out.println("-1 hex  : 0x"+Integer.toHexString(a));
            System.out.println("-1&0xff : 0x"+Integer.toHexString(a&0xff));
    
            System.out.println("-1 bin  : "+  Integer.toBinaryString(a));
            System.out.println("-1&0xff bin: "+ Integer.toBinaryString(a&0xff));
    
            System.out.println("127 bin    : "+ Integer.toBinaryString(127));
            System.out.println("-128 bin   : "+  Integer.toBinaryString(-128));
    
        }

     Java的二进制采用补码形式,byte范围是[-128, 127],而Integer.toHexString的参数是int,如果不进行&0xff,那么当一个byte会转换成int时,对于负数,会做位扩展,

    举例来说,一个byte类型的-1(即0xff),会被转换成int 类型的-1(即0xffffffff),那么转化出的结果就不是我们想要的了。

    -1 hex  : 0xffffffff
    -1&0xff : 0xff
    -1 bin : 11111111111111111111111111111111 -1&0xff bin: 11111111
    127 bin : 1111111 -128 bin : 11111111111111111111111110000000

    三。将十六进制字符串存为字节数组,可以节省存储空间

    0499AFA3432E9F2EBD81C134C1F5E4B3(MD5串)

    如果把这个MD5串直接存为字符串,就是32个字节(byte),就是256二进制位。

    如果把MD5串的每个字符用16进制字符来表示,那么用二进制位就会表示成4个二进制位,总共是128位,也就是16个字节。那么节省了一半的存储空间。

    四。在定义int类型的变量时,使用十六进制表示有什么好处?

    int a = 0b11000011001111001100011100101000

    还是这样好?

    1100 0011 0011 1100 1100 0111 0010 1000
    int a = 0xC33CC728

    参考:

    用同余理解补码

  • 相关阅读:
    js组件常用封装方法。。。。。【组件封装】 ★★★★★★ 1月会员日 集人气【弹窗】
    以后开公司用的资源瞎记录
    SpringSecurityFilter 链
    分布式系统数据一致性的6种方案(转)
    统一日志监控系统 springboot websocket 作品
    MyBatis generator 使用方式 小结
    swagger and restful api 参考
    kafka linux 启动脚本 sample
    转 CAS实现SSO单点登录原理
    江南白衣 Java性能优化PPT
  • 原文地址:https://www.cnblogs.com/yuyutianxia/p/7102425.html
Copyright © 2020-2023  润新知