前段时间开发手持机上的软件,因为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; }