十六进制与字节数组转换

前段时间开发手持机上的软件,因为A8手持机的射频卡可存储的内容太小,并且需要存储16进制数据,因此就写了一个工具类。

上代码:

package cn.com.szh;

import java.io.UnsupportedEncodingException;

public class Main {

    public static void main(String[] args) {
        String str = "01##0300000005";
            byte[] by;
            try {
                by = str.getBytes("US-ASCII");
                String str1 = byteArrayToHexString(by);
                System.out.println(str1);
                
                
                System.out.println(new String(hexStringToByteArray(str1)));
            } catch (UnsupportedEncodingException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
    }
    /**
     * 十六进制转换为字节数组
     * @param s
     * @return
     */
    public static byte[] hexStringToByteArray(String s) {
        //十六进制转byte数组
        int len = s.length();
        byte[] bs = new byte[len/2];
        for(int i = 0;i < len;i+=2) {
            bs[i/2] = (byte) ((Character.digit(s.charAt(i), 16) << 4) + Character.digit(s.charAt(i+1), 16));
        }
        return bs;
    }
    /**
     * 字节数组转十六进制
     * @param data
     * @return
     */
    public static String byteArrayToHexString(byte[] data) {
        StringBuilder sBuilder = new StringBuilder();
        for(int i = 0;i < data.length;i++) {
            String str1 = Integer.toHexString(data[i]&0xFF);
            sBuilder.append(str1);
        }
        return sBuilder.toString();
    }
}

以上是针对手持机转十六进制的代码和用法,这种转换是根据硬件底层的需要进行转化。但在通常情况下可能并不方便,因为转十六进制的时候,还需要先把字符先转到字节数组。

下面写个通用的方法,这个方法是把传入的字符串直接转换成十六进制,不需要先转换成字节数组。不过缺点也很明显,就是一个字符要占4个位置,而先转成字节数组再转换十六进制,一个字符只占两个位置。

public static String deUnicode(String content) {// 将16进制数转换为汉字
    String enUnicode = null;
    String deUnicode = null;
    for (int i = 0; i < content.length(); i++) {
        if (enUnicode == null) {
            enUnicode = String.valueOf(content.charAt(i));
        } else {
            enUnicode = enUnicode + content.charAt(i);
        }
        if (i % 4 == 3) {
            if (enUnicode != null) {
                if (deUnicode == null) {
                    deUnicode = String.valueOf((char) Integer.valueOf(
                            enUnicode, 16).intValue());
                } else {
                    deUnicode = deUnicode
                            + String.valueOf((char) Integer.valueOf(
                            enUnicode, 16).intValue());
                }
            }
            enUnicode = null;
        }

    }
    return deUnicode;
}

public static String enUnicode(String content) {// 将汉字转换为16进制数
    String enUnicode = null;
    for (int i = 0; i < content.length(); i++) {
        if (i == 0) {
            enUnicode = getHexString(Integer.toHexString(content.charAt(i)).toUpperCase());
        } else {
            enUnicode = enUnicode
                    + getHexString(Integer.toHexString(content.charAt(i))
                    .toUpperCase());
        }
    }
    return enUnicode;
}


private static String getHexString(String hexString) {
    String hexStr = "";
    for (int i = hexString.length(); i < 4; i++) {
        if (i == hexString.length())
            hexStr = "0";
        else
            hexStr = hexStr + "0";
    }
    return hexStr + hexString;
}

猜你喜欢

转载自blog.csdn.net/little_soybean/article/details/80506814