一、byte[]类型转换为明码的String类型
/**
* @param bArray
* @return
* @byte[] 转成string
*/
public String bytesToHexString(byte[] bArray) {
StringBuffer sb = new StringBuffer(bArray.length);
String sTemp;
for (int i = 0; i < bArray.length; i++) {
sTemp = Integer.toHexString(0xFF & bArray[i]); //若为负数,则清除高位,正数不受影响
if (sTemp.length() < 2)
sb.append(0);
sb.append(sTemp.toUpperCase()); //大写
}
return sb.toString();
}
在32位的电脑中数字都是以32格式存放的,如果是一个byte(8位)类型的数字,他的高24位里面都是随机数字,低8位才是实际的数据。java.lang.Integer.toHexString() 方法的参数是int(32位)类型,如果输入一个byte(8位)类型的数字,这个方法会把这个数字的高24为也看作有效位,这就必然导致错误,使用& 0XFF操作,可以把高24位置0以避免这样错误的发生。
二、明文String转换为byte[]类型
/**
* @param str
* @return by qiao
* 明文转
* @string 转为byte[]
*/
public byte[] hexStringToByte(String str) {
if (str.length() % 2 != 0) {
return null;
}
//都是大写字母就可以不转换成全大写
str = str.toUpperCase();
int len = str.length() / 2;
char[] charArray = str.toCharArray();
byte[] array = new byte[len];
for (int i = 0; i < len; i++) {
char hBit = charArray[2 * i];
char lBit = charArray[2 * i + 1];
int hNum = (hBit > '9') ? (hBit - 'A' + 10) : (hBit - '0');
int lNum = (lBit > '9') ? (lBit - 'A' + 10) : (lBit - '0');
array[i] = (byte) (hNum * 16 + lNum);
}
return array;
}
三、对数据进行异或运算
/**
* 全体数据取亦或
*
* @param data
* @return
*/
public String getCheckNum(byte[] data) {
int checknum = 0;
for (int i = 0; i < data.length; i++) //qiao:开始i为0改为1,长度减去2
{
checknum = checknum ^ data[i]; //异或得出校验码 数据开始与0异或为本身
}
byte checkresult=(byte) checknum;
return bytesToHexString(new byte[]{checkresult}); //int转string
}
四、转成固定位数的Hex数值
/**
* @param bytecount 转成h固定位数的hex数值,如2byte,200,转成0200
* @param data
* @return
*/
public String byteFromIntBCD(int bytecount,int data)
{
try
{
byte[] result=new byte[bytecount];
String newdata=String.format("%0"+bytecount*2+"d",data);
return newdata;
}
catch (Exception ex)
{
return String.format("%0"+bytecount*2+"d",0);
}
}
b,布尔类型,只要实参为非false的布尔类型,均格式化为字符串true,否则为字符串false。 d,整数类型(十进制)。 x,整数类型(十六进制)。 o,整数类型(八进制) n,平台独立的换行符, 也可通过System.getProperty("line.separator")获取
// 0 代表前面补充0 // bytecount*2代表长度 // d 代表参数为正数型
五、long型转成固定位数的Hex(实际转换getBytes)
/**
* @param bytecount 转成h固定位数的hex数值,如2,10,转成000A
* @param data 右补齐
* @return
*/
public String byteFromInt(int bytecount,long data)
{
byte[] result=new byte[bytecount];
String newdata=String.format("%0" +bytecount*2+"x",data);
return newdata;
}
六、byte[] 转GBK
/**
* byte[]STRING转GBK
* @param data
* @return
*/
public String GetGbkString(byte[] data)
{
String result="";
if (data.length==0)
return "";
try {
result=new String(data,"gbk");
} catch (UnsupportedEncodingException e) {
result=new String(data);
}
return result;
}
七、Long转成Double
/**
*Long转成double
* @param data
* @return
*/
public double BytesToDouble(byte[] data)
{
String _stri = bytesToHexString(data);
long sLat = Long.parseLong(_stri, 16);
double result = sLat *1.0; //乘客位置纬度
return result;
}
八、byte[] 转GBK
public String TextDown(byte[] data){
byte[] tag = new byte[1];
System.arraycopy(data, 13, tag, 0, 1); //标志
byte[] describe = new byte[Protrol.getInstance().getMsgBodyLength(data) - 2]; //文本信息STRING
System.arraycopy(data, 14, describe, 0, Protrol.getInstance().getMsgBodyLength(data) - 2); //长度问题
String s = "";
try {
s = new String(describe, "gbk"); //s文本信息
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
}
return s;
}
byte[] tag = new byte[1];
System.arraycopy(data, 13, tag, 0, 1); //标志
String qTag = Protrol.getInstance().bytesToHexString(tag);
int questionTag = Integer.parseInt(qTag,16);
System.out.println(questionTag+"标志");
/**
* 左补齐
* @param bytecount
* @param data
* @return
*/
public String byteFromIntRight(int bytecount,byte[] data)
{
try
{
byte[] result=new byte[bytecount];
System.arraycopy(data,0,result,0,data.length);
return bytesToHexString(result);
}
catch (Exception ex)
{
return String.format("%0"+bytecount*2+"d",0);
}
}