本篇博文旨在将数据转化做成工具,以供我们在使用时的便利(应用场景举例:多文件传输时的数据转化,服务器客户端之间的数据转化),其中包含的byte与其他几种基本类型之间的转化,可能遇到的问题在代码中以注释的形式加以叙述。
public class BitToAll {
private static final String Tensix = "0123456789ABCDEF";
public BitToAll() {
}
public static String Bytetostring(byte by) {
return "" + Tensix.charAt((by >> 4) & 0x0F)
+ Tensix.charAt(by & 0x0F);
//byte是8位的,将前四位转化成第一个字符,将后四位转化成第二个字符,然后拼接
}
public static String Bytestostring(byte[] value) {//一个byte元素是一个字节
if(value == null) {
return null;
}
StringBuffer sber = new StringBuffer("");
for(byte values :value) {
sber.append(Bytetostring(values));//数组每个元素对应2个字符,所以输出的16进制字符串长度是value数组的两倍
}
return sber.toString();
}
public static Byte Stringtobyte(String para) {
if(para==null||para.length()!=2) {//两个字符转化成一个byte元素
return null;
}
byte result = 0;
result += (byte)(Tensix.indexOf(para.substring(0,1))<<4);//取第一个元素左移4位得到高四位
result += (byte)((Tensix.indexOf(para.substring(1, 2)))&0x0f);//取第二个元素和0x0f相与得到低四位
return result;
}
public static Byte[] Stringtobytes(String str) {
if(str == null||str.length()%2 != 0) {//两个字符转化成一个byte元素,所以必定是偶数长度
return null;
}
Byte[] res = new Byte[str.length()/2];//数组每个元素对应2个字符,所以value数组的长度是字符串长度的一半
for(int i = 0 ; i < str.length()/2;i++) {
res[i] = Stringtobyte(str.substring(2*i,2*i+2));//两个两个进行处理
}
return res;
}
public static int bytetoint(byte[] paras) {
int res = 0;
int temp = 0xFF;
for(int i = 0;i < 4;i++) {
res |= ((paras[3-i] << (i*8)) & temp);//每次把数字左移8位在和对应的0xff移动后的值相与(低八位是数组的最后)
temp <<= 8;
}
//详述 :i= 0;得到数组第4个元素是一个Byte类型的8位数据,将他和0xff与得到低八位
// i = 1;得到数组第3个元素是一个Byte类型的8位数据,左移8位,将他和0xff00相与得到次八位
// i = 2;得到数组第2个元素是一个Byte类型的8位数据,左移16位,将他和0xff0000相与得到中八位
// i = 3;得到数组第1个元素是一个Byte类型的8位数据,左移24位,将他和0xff000000相与得到高八位
// 把每次得到的数据拼接起来就是32位的int类型数据
return res;
}
public static byte[] inttobyte(int para) {
int len = 4;//int 为四字节
byte[] res = new byte[len];
for(int i = 0; i < len ; i++) {
res[len-i-1] = (byte)((para >> i*8) & 0xFF);
//int 是32位的
// 先将低8位的数据取出来,& 0xFF得到数组的第4个元素
// para右移8位得到次8位,& 0xFF得到数组的第3个元素。。
}
return res;
}
public static byte[] Longtobyte(long para) {
int len = 8;//int 为四字节
byte[] res = new byte[len];
for(int i = 0; i < len ; i++) {
res[len-1-i] = (byte)((para >> i*8) & 0xFF);//从低到高以此得到每八位数据
}
return res;
}
public static long bytetolong(byte[] paras) {
long res = 0;
long temp = 0xFF;
for(int i = 0;i < 8;i++) {
res |= ((paras[7-i] << (i*8)) & temp);//每次把数字左移8位在和对应的0xff移动后的值相与(低八位是数组的最后)
temp <<= 8;
}
//例子:i= 0 ;得到数组第一个元素是一个Byte类型的8位数据,将他和0ff与得到低八位
// i = 1;得到数组第二个元素是一个Byte类型的8位数据 左移8位,将他和0xff00得到次八位
// i = 2;得到数组第三个元素是一个Byte类型的8位数据 左移16位,将他和0xff0000得到中八位
// i = 3;得到数组第四个元素是一个Byte类型的8位数据 左移24位,将他和0xff000000得到高八位
// ..... i = 7
// 把每次得到的数据拼接起来就是64位的long类型数据
return res;
}
}
测试结果: