package com.ruoyi.common.utils.netty; public class ConvertCode { /** * @param b 字节数组 * @return 16进制字符串 * @Title:bytes2HexString * @Description:字节数组转16进制字符串 */ public static String bytes2HexString(byte[] b) { StringBuffer result = new StringBuffer(); String hex; for (int i = 0; i < b.length; i++) { hex = Integer.toHexString(b[i] & 0xFF); if (hex.length() == 1) { hex = '0' + hex; } result.append(hex.toUpperCase()); } return result.toString(); } /** * @param src 16进制字符串 * @return 字节数组 * @Title:hexString2Bytes * @Description:16进制字符串转字节数组 */ public static byte[] hexString2Bytes(String src) { int l = src.length() / 2; byte[] ret = new byte[l]; for (int i = 0; i < l; i++) { ret[i] = (byte) Integer .valueOf(src.substring(i * 2, i * 2 + 2), 16).byteValue(); } return ret; } /** * @param strPart 字符串 * @return 16进制字符串 * @Title:string2HexString * @Description:字符串转16进制字符串 */ public static String string2HexString(String strPart) { StringBuffer hexString = new StringBuffer(); for (int i = 0; i < strPart.length(); i++) { int ch = (int) strPart.charAt(i); String strHex = Integer.toHexString(ch); hexString.append(strHex); } return hexString.toString(); } /** * @param src 16进制字符串 * @return 字节数组 * @throws * @Title:hexString2String * @Description:16进制字符串转字符串 */ public static String hexString2String(String src) { String temp = ""; for (int i = 0; i < src.length() / 2; i++) { //System.out.println(Integer.valueOf(src.substring(i * 2, i * 2 + 2),16).byteValue()); temp = temp + (char) Integer.valueOf(src.substring(i * 2, i * 2 + 2), 16).byteValue(); } return temp; } /** * @param src * @return * @throws * @Title:char2Byte * @Description:字符转成字节数据char-->integer-->byte */ public static Byte char2Byte(Character src) { return Integer.valueOf((int) src).byteValue(); } /** * @param a 转化数据 * @param len 占用字节数 * @return * @throws * @Title:intToHexString * @Description:10进制数字转成16进制 */ public static String intToHexString(int a, int len) { len <<= 1; String hexString = Integer.toHexString(a); int b = len - hexString.length(); if (b > 0) { for (int i = 0; i < b; i++) { hexString = "0" + hexString; } } return hexString; } /** * 将16进制的2个字符串进行异或运算 * http://blog.csdn.net/acrambler/article/details/45743157 * * @param strHex_X * @param strHex_Y 注意:此方法是针对一个十六进制字符串一字节之间的异或运算,如对十五字节的十六进制字符串异或运算:1312f70f900168d900007df57b4884 * 先进行拆分:13 12 f7 0f 90 01 68 d9 00 00 7d f5 7b 48 84 * 13 xor 12-->1 * 1 xor f7-->f6 * f6 xor 0f-->f9 * .... * 62 xor 84-->e6 * 即,得到的一字节校验码为:e6 * @return */ public static String xor(String strHex_X, String strHex_Y) { //将x、y转成二进制形式 String anotherBinary = Integer.toBinaryString(Integer.valueOf(strHex_X, 16)); String thisBinary = Integer.toBinaryString(Integer.valueOf(strHex_Y, 16)); String result = ""; //判断是否为8位二进制,否则左补零 if (anotherBinary.length() != 8) { for (int i = anotherBinary.length(); i < 8; i++) { anotherBinary = "0" + anotherBinary; } } if (thisBinary.length() != 8) { for (int i = thisBinary.length(); i < 8; i++) { thisBinary = "0" + thisBinary; } } //异或运算 for (int i = 0; i < anotherBinary.length(); i++) { //如果相同位置数相同,则补0,否则补1 if (thisBinary.charAt(i) == anotherBinary.charAt(i)) { result += "0"; } else { result += "1"; } } return Integer.toHexString(Integer.parseInt(result, 2)); } /** * Convert byte[] to hex string.这里我们可以将byte转换成int * * @param src byte[] data * @return hex string */ public static String bytes2Str(byte[] src) { StringBuilder stringBuilder = new StringBuilder(""); if (src == null || src.length <= 0) { return null; } for (int i = 0; i < src.length; i++) { int v = src[i] & 0xFF; String hv = Integer.toHexString(v); if (hv.length() < 2) { stringBuilder.append(0); } stringBuilder.append(hv); } return stringBuilder.toString(); } /** * @param * @return 接收字节数据并转为16进制字符串 */ public static String receiveHexToString(byte[] by) { try { /*io.netty.buffer.WrappedByteBuf buf = (WrappedByteBuf)msg; ByteBufInputStream is = new ByteBufInputStream(buf); byte[] by = input2byte(is);*/ String str = bytes2Str(by); str = str.toLowerCase(); return str; } catch (Exception ex) { ex.printStackTrace(); System.out.println("接收字节数据并转为16进制字符串异常"); } return null; } /** * "7dd",4,'0'==>"07dd" * * @param input 需要补位的字符串 * @param size 补位后的最终长度 * @param symbol 按symol补充 如'0' * @return N_TimeCheck中用到了 */ public static String fill(String input, int size, char symbol) { while (input.length() < size) { input = symbol + input; } return input; } public static void main(String args[]) { String productNo = "3030303032383838"; System.out.println(hexString2String(productNo)); productNo = "04050103000001070302050304"; System.out.println(hexString2String(productNo)); } }