字节数组转成16进制字符串,有个地方没看懂

时间:2023-01-11 12:00:56
字节数组转成16进制字符串,有个地方没看懂

标注的地方实在没看懂,为什么<2 要添加0,是什么原理?

 if (hv.length() < 2) {   
            stringBuilder.append(0);   
  }   

8 个解决方案

#1


就是补零。凑成两位。

#2


引用 1 楼 oyljerry的回复:
就是补零。凑成两位。

能帮忙解答一下在什么情况下需要补0,是16进制最前面那个0还是什么情况!

#3


引用 2 楼 zouyang2014 的回复:
Quote: 引用 1 楼 oyljerry的回复:
就是补零。凑成两位。

能帮忙解答一下在什么情况下需要补0,是16进制最前面那个0还是什么情况!

这种问题自己写个单元测试测一下就知道了,比如 Integer i = 15; Integer.toHexString(i) 结果就是 "f",这种情况在前面补个0 就是 "0f",
Integer i = 16; Integer.toHexString(i) 结果就是 "10",这种情况就不需要补0了

#4


一个char是8字节,而4个字节就可以表示一个十六进制,因此一个char转换成十六进制需要转换成两位十六进制,
也就是:1111 1111 = F F,所以如果只有一位,就需要将高位的F补0。

#5


倒不如直接 String hv = String.format("%02X", v);

#6


不要这样做,这样做性能较差,参考:


public class Hex {

    private static final char[] HEX = "0123456789abcdef".toCharArray();

    private Hex() {
    }

    public static void main(String[] args) {

        byte[] bytes = { 0 , 1 , 2 , (byte)0x7f };

        System.out.println( toHex( bytes ) );
    }

    public static String toHex(byte[] bytes) {

        if ( bytes == null ) {
            return null;
        }

        char[] chs = new char[bytes.length << 1];

        for ( int i = 0 , k = 0 ; i < bytes.length ; i++ ) {
            chs[k++] = HEX[(bytes[i] & 0xf0) >>> 4];
            chs[k++] = HEX[(bytes[i] & 0x0f)];
        }

        return new String(chs);
    }
}

#7


引用 4 楼 galiniur0u 的回复:
一个char是8字节,而4个字节就可以表示一个十六进制,因此一个char转换成十六进制需要转换成两位十六进制,
也就是:1111 1111 = F F,所以如果只有一位,就需要将高位的F补0。

错了吧,一个char是8个位,4位就可以表示16进制

#8


引用 7 楼 tomomi 的回复:
Quote: 引用 4 楼 galiniur0u 的回复:

一个char是8字节,而4个字节就可以表示一个十六进制,因此一个char转换成十六进制需要转换成两位十六进制,
也就是:1111 1111 = F F,所以如果只有一位,就需要将高位的F补0。

错了吧,一个char是8个位,4位就可以表示16进制

所以一个char需要两个十六进制,那里错了?

#1


就是补零。凑成两位。

#2


引用 1 楼 oyljerry的回复:
就是补零。凑成两位。

能帮忙解答一下在什么情况下需要补0,是16进制最前面那个0还是什么情况!

#3


引用 2 楼 zouyang2014 的回复:
Quote: 引用 1 楼 oyljerry的回复:
就是补零。凑成两位。

能帮忙解答一下在什么情况下需要补0,是16进制最前面那个0还是什么情况!

这种问题自己写个单元测试测一下就知道了,比如 Integer i = 15; Integer.toHexString(i) 结果就是 "f",这种情况在前面补个0 就是 "0f",
Integer i = 16; Integer.toHexString(i) 结果就是 "10",这种情况就不需要补0了

#4


一个char是8字节,而4个字节就可以表示一个十六进制,因此一个char转换成十六进制需要转换成两位十六进制,
也就是:1111 1111 = F F,所以如果只有一位,就需要将高位的F补0。

#5


倒不如直接 String hv = String.format("%02X", v);

#6


不要这样做,这样做性能较差,参考:


public class Hex {

    private static final char[] HEX = "0123456789abcdef".toCharArray();

    private Hex() {
    }

    public static void main(String[] args) {

        byte[] bytes = { 0 , 1 , 2 , (byte)0x7f };

        System.out.println( toHex( bytes ) );
    }

    public static String toHex(byte[] bytes) {

        if ( bytes == null ) {
            return null;
        }

        char[] chs = new char[bytes.length << 1];

        for ( int i = 0 , k = 0 ; i < bytes.length ; i++ ) {
            chs[k++] = HEX[(bytes[i] & 0xf0) >>> 4];
            chs[k++] = HEX[(bytes[i] & 0x0f)];
        }

        return new String(chs);
    }
}

#7


引用 4 楼 galiniur0u 的回复:
一个char是8字节,而4个字节就可以表示一个十六进制,因此一个char转换成十六进制需要转换成两位十六进制,
也就是:1111 1111 = F F,所以如果只有一位,就需要将高位的F补0。

错了吧,一个char是8个位,4位就可以表示16进制

#8


引用 7 楼 tomomi 的回复:
Quote: 引用 4 楼 galiniur0u 的回复:

一个char是8字节,而4个字节就可以表示一个十六进制,因此一个char转换成十六进制需要转换成两位十六进制,
也就是:1111 1111 = F F,所以如果只有一位,就需要将高位的F补0。

错了吧,一个char是8个位,4位就可以表示16进制

所以一个char需要两个十六进制,那里错了?