汉字转GB2312|汉字转GB2312 -(字节累加和 - 按位取反) + 1 获取效验值

这几天应公司的要求要在一个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 =https://www.it610.com/article/= 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));

【汉字转GB2312|汉字转GB2312 -(字节累加和 - 按位取反) + 1 获取效验值】这就得到“a4” 了 。

    推荐阅读