与上一篇博客类似,这也是在同一个项目中遇到的一些问题,不过该问题是得到的字节数组的转换问题:
1,怎样将一个字符串转换为字节数组:
//模拟的字符串
String a="abcdefghij";
//定义一个字节数组
byte[] arr=new byte[25];
//将字符串转换成对应的字节放入字节数组中(也可以自己一个个放)
arr=a.getBytes();
然后调用输出流的write方法直接将字节数组传输出去
2,将数字转换为字节数组:
若只有一位,赋值强转(加上byte)即可,16进制一样。
若要转换成4位:
public static byte[] intToByteArray(int i) {
//定义字节数组的长度为4
byte[] result = new byte[4];
//由高位到低位
//右移,分别存入字节数组中
result[0] = (byte)((i >> 24) & 0xFF);
result[1] = (byte)((i >> 16) & 0xFF);
result[2] = (byte)((i >> 8) & 0xFF);
result[3] = (byte)(i & 0xFF);
return result;
}
3,将字节数组转化为字符串:
String s = "fs123fdsa";//String变量
byte b[] = s.getBytes();//String转换为byte[]
String t = new String(b);//bytep[]转换为String
4,字节数组转化为数字:
项目中是先将byte的每个数组(8位)转化成对应的整数,将整数转化为对应的16进制字符串,截取表示整数的部分,通过Integer.parseInt转化为对应的整数(转化为String类型时用了类似的方法)。即全部转化为16进制再处理。
5,返回16进制字符串对应的16进制对应的字节:
这句话有点别扭。比如“638666138e84c05f”是字节对应的16进制数,但显示在屏幕上的是个字符串,并不是16进制,这可以用commons-codec的Hex.encodeHexString直接转换过来。同样,我们要用这个16进制串对应的字节,转这个字符串肯定是不行的,要的是它的16进制对应的字符串,就用到了下面的方法:
public static byte[] toByteArray(String hexString) {
hexString = hexString.toLowerCase();
final byte[] byteArray = new byte[hexString.length() / 2];
int k = 0;
for (int i = 0; i < byteArray.length; i++) {//因为是16进制,最多只会占用4位,转换成字节需要两个16进制的字符,高位在先
byte high = (byte) (Character.digit(hexString.charAt(k), 16) & 0xff);
byte low = (byte) (Character.digit(hexString.charAt(k + 1), 16) & 0xff);
byteArray[i] = (byte) (high << 4 | low);
k += 2;
}
return byteArray;
}
6,字节对应的16进制数转成对应的16进制数的字符串:
不解释了,跟5是逆过程:638666138e84c05f--》“638666138e84c05f”
public static String toHexString(byte[] byteArray) {
if (byteArray == null || byteArray.length < 1)
throw new IllegalArgumentException("this byteArray must not be null or empty");
final StringBuilder hexString = new StringBuilder();
for (int i = 0; i < byteArray.length; i++) {
if ((byteArray[i] & 0xff) < 0x10)//0~F前面不零
hexString.append("0");
hexString.append(Integer.toHexString(0xFF & byteArray[i]));
}
return hexString.toString().toLowerCase();
}