这几天应公司的要求要在一个Android设备终端上链接LED显示屏,显示的内容需要不定时的更新。然后今天拿到条屏的发送协议,协议里在发送数据的格式上有几条之前没做过的处理,现在把数据处理的代码写出来了,在这里记录一下。
例子 : #&002200229001考试中注意安全a40a0d
在这里我要获取的是“a4” 这个效验
首先是将字符串转成 16进制的GB2312编码 :
{
// 这里是调用
String string = edit_text.getText().toString();
byte[] b = string.getBytes("GB2312");
String hexStr = bytesToHexFun1(b);
}
//将byte数组转成16进制字符串
public static String bytesToHexFun1(byte[] bytes) {
char[] HEX_CHAR = {'0', '1', '2', '3', '4', '5',
'6', '7', '8', '9', 'A', 'B', 'C', 'D', 'E', 'F'};
// 一个byte为8位,可用两个十六进制位标识
char[] buf = new char[bytes.length * 2];
int a = 0;
int index = 0;
for(byte b : bytes) { // 使用除与取余进行转换
if(b < 0) {
a = 256 + b;
} else {
a = b;
}
buf[index++] = HEX_CHAR[a / 16];
buf[index++] = HEX_CHAR[a % 16];
}
return new String(buf);
}
然后将得到的 hexStr 再去累加效验并取反:
我这里用的是两位校验,可以根据自己的需求更改
/**
* 累加和校验,并取反
*/
public static String makeCheckSum(String data) {
if (data == null || data.equals("")) {
return "";
}
int total = 0;
int len = data.length();
int num = 0;
while (num < len) {
String s = data.substring(num, num + 2);
System.out.println(s);
total += Integer.parseInt(s, 16);
num = num + 2;
}
//用256求余最大是255,即16进制的FF
int mod = total % 256;
if (mod == 0) {
return "FF";
} else {
String hex = Integer.toHexString(mod).toUpperCase();
hex = parseHex2Opposite(hex);
return hex;
}
}
/**
* 取反
*/
public static String parseHex2Opposite(String str) {
String hex;
//十六进制转成二进制
byte[] er = parseHexStr2Byte(str);
//取反
byte erBefore[] = new byte[er.length];
for (int i = 0; i < er.length; i++) {
erBefore[i] = (byte) ~er[i];
}
//二进制转成十六进制
hex = parseByte2HexStr(erBefore);
// 如果不够校验位的长度,补0,这里用的是两位校验
hex = (hex.length() < 2 ? "0" + hex : hex);
return hex;
}
/**
* 将十六进制转换为二进制
*/
public static byte[] parseHexStr2Byte(String hexStr) {
if (hexStr.length() < 1) {
return null;
}
byte[] result = new byte[hexStr.length() / 2];
for (int i = 0; i < hexStr.length() / 2; i++) {
int high = Integer.parseInt(hexStr.substring(i * 2, i * 2 + 1), 16);
int low = Integer.parseInt(hexStr.substring(i * 2 + 1, i * 2 + 2), 16);
result[i] = (byte) (high * 16 + low);
}
return result;
}
/**
* 将二进制转换成十六进制
*/
public static String parseByte2HexStr(byte buf[]) {
StringBuffer sb = new StringBuffer();
for (int i = 0; i < buf.length; i++) {
String hex = Integer.toHexString(buf[i] & 0xFF);
if (hex.length() == 1) {
hex = '0' + hex;
}
sb.append(hex.toUpperCase());
}
return sb.toString();
}
最后累加取反后 得到一个String take ,这个take 是16进制的 在将他加一:
String and = Integer.toHexString((Integer.valueOf(take, 16) + 1));
这就得到“a4” 了 。