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

    参考:

    用同余理解补码

  • 相关阅读:
    洛谷 P1057 传球游戏
    BZOJ 1801: [Ahoi2009]chess 中国象棋
    BZOJ 1806: [Ioi2007]Miners 矿工配餐
    51nod 1276 岛屿的数量
    BZOJ 1800: [Ahoi2009]fly 飞行棋
    路由控制和视图层
    django的零碎注意点
    Django框架简介
    Bootstrap框架
    jQuery基础知识
  • 原文地址:https://www.cnblogs.com/yuyutianxia/p/7102425.html
Copyright © 2011-2022 走看看