摘 要 本文用Java语言设计了一个数据处理的通用类,实现了字节(数组)与16进制字符串、英文字符串与16进制字节(数组)、Unicode编码与字符串等之间的相互转换,以及从ByteBuffer中获取byte数组和16进制字符串的格式化处理。所有方法均经过了严格的测试,并给出了可视化的测试结果。
关键词 16进制,字节,字符串,Unicode编码
一、引言
无论在何种计算机高级语言中,都涉及到字节数据的表示、转换和显示等处理,下表所示就是字节的不同表示方法,“─”表示不可见字符。文献[1]用Visual Basic 6.0 实现了数据的表示与转换技术。由于Java具有“一次编译,到处运行”的跨平台特性,因而,有必要对基于Java技术的通用数据处理技术进行研究,达到软件复用的效果。本文用ByteProcess类实现字节(数组)与16进制字符串、英文字符串与16进制字节(数组)、Unicode编码与字符串等之间的相互转换,以及从ByteBuffer中获取byte数组和16进制字符串的格式化处理。
Java中static修饰的静态方法是属于整个类的,在内存中的代码段将随着类的定义而分配和装载,而引用静态方法,采用对象名或类名均可。由于static方法只能访问static方法或数据成员,但是,非static方法可以访问static和非static方法和数据成员[2]。为了在不生成对象的情况下就可以直接使用ByteProcess类中的方法,并且,使其可以被static方法和非static方法访问,将ByteProcess中的所有方法都设置为static方法。如下定义的16进制字符串的集合用于将16进制字符转换为对应的数值:
static private final String CharSet = "0123456789ABCDEF";
二、16进制字符串转换为字节(数组)
要将16进制字符串转换为字节,首先需要将16进制字符,即"0-9"与"A-F"转换为对应的数值。HexCharToNum方法实现该功能,例如将"A"转换为整数10、"9"转换为整数9等。在转换前,首先需要将输入参数利用toUpperCase方法转换为大写,然后求出在16进制字符串集合CharSet中的索引位置即为对应的数值。HexCharToNum的源代码如下:
public static int HexCharToNum(String ch){
ch = ch.toUpperCase();
return CharSet.indexOf(ch);
}
对于两个16进制字符转换为字节,首先通过substring方法取得对应的字符,然后利用HexCharToNum方法转换为对应的数值,高位乘以16加上低位就可以得到结果。TwoHexCharsToByte方法的源代码如下:
public static byte TwoHexCharsToByte(String chs){
int i,j;
chs = chs.toUpperCase();
if (chs.length() < 2) return -1;
i = HexCharToNum(chs.substring(0,1));
j = HexCharToNum(chs.substring(1,2));
return (byte)(i*16+j);
}
对于16进制字符串转换为字节数组,首先,将输入参数的字符长度除以2作为字节数组的长度,构建数组后,通过TwoHexCharsToByte方法,将每2个16进制字符转换为字节,依次存入字节数组即可。HexCharsToBytes的源代码如下:
public static byte[] HexCharsToBytes(String chs){
int i, nLen;
byte bTmp;
nLen = (chs.length())/2;
byte[] bResult = new byte[nLen];
for (i=0; i bTmp = TwoHexCharsToByte(chs.substring(i*2,(i+1)*2));
bResult[i] = bTmp;
}
return bResult;
}
三、字节(数组)转换为16进制字符串
ByteToTwoHexChar方法实现字节到16进制字符串的转换,例如,将字节0x3d转换为"3D"。首先,将字节右移4位与0xf相与,得到字节的高4位值,然后,利用substring方法,取得16进制字符串CharSet中对应的一个字符。以此方法,获取低4位对应的字符,然后,再将两个字符合并,即可得到字节对应的16进制字符串。ByteToTwoHexChar方法对应的源代码如下:
public static String ByteToTwoHexChar(byte bIn) {
int i, j;
String strResult = "";
i = ((int)bIn >> 4 & 0xf);
strResult += CharSet.substring(i, i+1);
j = (int)bIn & 0xf;
strResult += CharSet.substring(j, j+1);
return strResult;
}
将字节数组转换为16进制字符串,可以方便地显示不可见字符所对应的字节。首先,取得字节的长度,然后,通过循环,利用ByteToTwoHexChar方法将一个字节转换为2个16进制字符,然后进行合并,即可得到字节数组对应的16进制字符串。BytesToHexChars方法实现此功能,对应的源代码如下:
public static String BytesToHexChars(byte[] bIn){
int nLen;
String strResult = "";
nLen = bIn.length;
for(int i=0; i strResult += ByteToTwoHexChar(bIn[i]);
}
return strResult;
}