Java十六进制与字节数组的相互转换

十六进制转换为字节数组

  1. 先获取到十六进制数字字符串的长度,如果是奇数,在前面补个零;
  2. 使用字符串的长度,计算出需要几个字节;
  3. 跟进字节个数创建字节数组;
  4. 将字符串转换为字符数组;
  5. 写一个循环,循环的次数为字节数组的长度
  6. 循环内是讲字符转换为字节,并赋值给当前字节数组的位置
  7. 字符转换为字节的方法参考后边charToByte();
  8. 由于十六进制的字节是用二进制的8位来表示的,它又分为高四位,与低四位,所以当我们拿到偶数位的字节时,要将它左移4位(也就是乘以16),再与低四位的字节进行逻辑运算或,才能表示一个字节的十六进制。
  9. 给字节数组赋完值之后,返回即可。
private byte charToByte(char c){
    String chars = "0123456789ABCDEF";
    byte b = (byte)chars.indexOf(c);
    return b;
}
private byte[] hexStrToBytes(String hexStr){
    if(TextUtils.isEmpty(hexStr) || hexStr.length()==0){
        return null;
    }
    if(hexStr.lenth()%2 == 1){
       hexStr = "0"+hexStr;
    }
    int len = hexStr.length()/2;
    byte[] result = new byte[len];
    char[] chars = hexStr.toCharArrary();
    for(int i=0;i<len;i++){
        result[i] = (byte)(charToByte(chars[i])<<4 | charToByte(chars[i+1]));
    }
    return result;
}

字节数组转为十六进制字符串

  1. 如果字节数组是空的,直接返回null;
  2. 创建一个StringBuffer对象用来拼接字符串;
  3. 遍历字节数组;
  4. 让每一个字节与0xFF相与,得到一个int值;为什么要与(int)0xFF相与,是因为最大的字节也不会超过两位的十六进制数据(0xFF)。
  5. 将得到的int值使用toHexString()转化为十六进制的字符串;
  6. 判断得到的字符串的长度看是否小于2,如果小于2,则在字符串前面添加个0,;为什么要看字符串长度是否小于2,是因为如果该值小于16的话,只用一个字符就可以表示,而一个字节是8位,一个十六进制的字符只能表示4位,所以一个字节必须用两个十六进制字符表示。
  7. 将所有的字节转换为十六进制的字符串之后,把它们拼接起来并返回。
private String bytesToHexStr(btye[] bytes){
    if(bytes == null){
        return null;
    }
    StringBuffer sb = new StringBuffer();
    String strInt = "";
    for(int i=0;i<bytes.length,i++){
        strInt = Integer.toHexString(bytes[i]&0xFF);    
        if(strInt.length()<2){
            sb.append(0)
        }
        sb.append(strInt.toUpperCase());
    }
    return sb.toString
}

注意:
十六进制字符串一定要转成大写,不然会出错误,今天就是自己踩了这个坑。具体问题是将f转化为字节时,indexOf()返回是-1,用十六进制表示就是0xFF。

猜你喜欢

转载自blog.csdn.net/yangshuangyue/article/details/80685892