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

参考:

用同余理解补码

原文地址:https://www.cnblogs.com/yuyutianxia/p/7102425.html