zoukankan      html  css  js  c++  java
  • 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

    参考:

    用同余理解补码

  • 相关阅读:
    安装 SciPy 和 scikit-learn 升级pip 及pip基本命令表
    js修改:before、:after的内容
    初试Celery
    python中的@
    python去除空格和换行符的方法
    Beautiful 疑问小记
    http://www.oreilly.com/catalog/errataunconfirmed.csp?isbn=9780596529321
    浏览器提示框事件
    从欧几里得距离、向量、皮尔逊系数到http://guessthecorrelation.com/
    win安装NLTK出现的问题
  • 原文地址:https://www.cnblogs.com/yuyutianxia/p/7102425.html
Copyright © 2011-2022 走看看