EXPT1:ByteUtil

该.java文件包含两个函数。

        -public static String bytes2HexString(byte[] srcBytes)

        -public staticbyte[] hexString2Bytes(String hexString)

一、 public static String bytes2HexString(byte[] srcBytes)

 /**
     * 字节数组转十六进制字符串
     * {1,15} --> "010f"
     *
     * @param srcBytes 字节数组
     * @return
     */
    public static String bytes2HexString(byte[] srcBytes) {
        StringBuilder hexBuilder = new StringBuilder();
        if (srcBytes != null) {
            for (byte b : srcBytes) {
                if ((b & 0xFF) > 15) {
                    //	Integer.toHexString  转为字符串,但必须传入int类型,因此需要类型转换
                    hexBuilder.append(Integer.toHexString(b & 0xff));
                } else {
                    hexBuilder.append(0).append(Integer.toHexString(b));
                }
            }
        }
        return hexBuilder.toString();
    }

Q1.为什么用StringBuilder不用String类型?

        String的值不可变,StringBuilder的值是可变的。String每赋予一个值,都会产生一个新的地址,而StringBuilder是在原有地址上一直更改的,节省了大量的空间,运行速度更快。

Q2. b & 0xFF是在干什么?

        这个涉及到Java的类型转换。byte为1个字节(8位),int为4个字节(32位),使用b&0xFF的意思就是将byte型变量b扩展为int整型变量。可能会疑问,0xFF不也是8位吗?怎么能扩展呢?那是因为高位全是0省略了。实际这的0xFF就是一个32位的整型数。

        首先是这个if判断 if ((b & 0xFF) > 15)。15为int类型(java默认一个常数就是int类型),b为byte,不能直接比较,必须转换才行。

        其次是hexBuilder.append(Integer.toHexString(b & 0xff));  Integer.toHexString作用是转为字符串,但必须传入int类型(如下图所示),而b是byte类型,因此也需扩展为int才行。

(在Android Studio里面鼠标点中一个函数名,再按ctrl+B就可以看到他的实现) 

二、 public static byte[] hexString2Bytes(String hexString)

见代码以及注释。 

    /**
     * 十六进制字符串转字节数组
     *
     * @param hexString 十六进制字符串
     * @return 字节数组
     */
    public static byte[] hexString2Bytes(String hexString) {
//        新建一个byte数组,因为两个字符才能转为1个byte,所以长度只有hexString.length() / 2
        byte[] bytes = new byte[hexString.length() / 2];
        int j = 0;
        for (int i = 0; i < bytes.length; i++) {
//            Character.digit(string,radix) 为进制转换,
//               输入进制为radix的String,返回其对应的十进制数字
//            charAt(index)为字符串取出s[index]
            byte high = (byte) (Character.digit(hexString.charAt(j), 16) & 0xff);      //字节数的高位  
            byte low = (byte) (Character.digit(hexString.charAt(j + 1), 16) & 0xff);   //字节数的地位
            bytes[i] = (byte) (high << 4 | low);                      //高位左移4位,在与低位异或得整个字节数
            
            j += 2;
        }
        return bytes;
    }

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

ad_m1n

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值