| New file |
| | |
| | | package com.genersoft.iot.vmp.netty.util; |
| | | |
| | | import java.io.UnsupportedEncodingException; |
| | | import java.nio.charset.StandardCharsets; |
| | | import java.util.ArrayList; |
| | | import java.util.List; |
| | | |
| | | public class HexStringTool { |
| | | |
| | | |
| | | private static final char[] HEX_CHAR_ARR = {'0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'a', 'b', 'c', 'd', 'e', 'f'}; |
| | | |
| | | private static final String HEX_STR = "0123456789abcdef"; |
| | | |
| | | //对字符串,进行分组,转化为List |
| | | public static List<String> getStrList(String str16, int frontLen, int size, int length) { |
| | | List<String> list = new ArrayList<String>(); |
| | | String content = str16.substring(frontLen); |
| | | String tem = ""; |
| | | for (int index = 0; index < size; index++) { |
| | | tem = content.substring(0, length); |
| | | content = content.substring(length); |
| | | list.add(tem); |
| | | } |
| | | return list; |
| | | } |
| | | |
| | | //对字符串,进行分组,转化为List(字符串数据类型转化专用) |
| | | public static List<String> getStrList(String str16, int frontLen, int size, int totalLen, int lenLen) { |
| | | List<String> list = new ArrayList<>(); |
| | | String content = str16.substring(frontLen); |
| | | String tem = ""; |
| | | for (int index = 0; index < size; index++) { |
| | | String len16 = content.substring(totalLen * 2, (totalLen + lenLen) * 2); |
| | | int len = Integer.parseInt(len16, 16); |
| | | int length = (totalLen + lenLen + len) * 2; |
| | | tem = content.substring(0, length); |
| | | content = content.substring(length); |
| | | list.add(tem); |
| | | } |
| | | return list; |
| | | } |
| | | |
| | | //字符串转换unicode |
| | | public static String string2Unicode(String string) { |
| | | StringBuffer unicode = new StringBuffer(); |
| | | for (int i = 0; i < string.length(); i++) { |
| | | // 取出每一个字符 |
| | | char c = string.charAt(i); |
| | | // 转换为unicode |
| | | unicode.append("\\u" + Integer.toHexString(c)); |
| | | } |
| | | return unicode.toString(); |
| | | } |
| | | |
| | | //字符串转化成为16进制字符串 |
| | | public static String strTo16(String s) { |
| | | String str = ""; |
| | | for (int i = 0; i < s.length(); i++) { |
| | | int ch = (int) s.charAt(i); |
| | | String s4 = Integer.toHexString(ch); |
| | | str = str + s4; |
| | | } |
| | | return str; |
| | | } |
| | | |
| | | //16进制转换成为string类型字符串 |
| | | public static String hexStringToString(String s) { |
| | | if (s == null || s.equals("")) { |
| | | return null; |
| | | } |
| | | s = s.replace(" ", ""); |
| | | byte[] baKeyword = new byte[s.length() / 2]; |
| | | for (int i = 0; i < baKeyword.length; i++) { |
| | | try { |
| | | baKeyword[i] = (byte) (0xff & Integer.parseInt(s.substring(i * 2, i * 2 + 2), 16)); |
| | | } catch (Exception e) { |
| | | e.printStackTrace(); |
| | | } |
| | | } |
| | | try { |
| | | s = new String(baKeyword, "UTF-8"); |
| | | new String(); |
| | | } catch (Exception e1) { |
| | | e1.printStackTrace(); |
| | | } |
| | | return s; |
| | | } |
| | | |
| | | //unicode 转字符串 |
| | | public static String unicode2String(String unicode) { |
| | | StringBuffer string = new StringBuffer(); |
| | | String[] hex = unicode.split("\\\\u"); |
| | | for (int i = 1; i < hex.length; i++) { |
| | | // 转换出每一个代码点 |
| | | int data = Integer.parseInt(hex[i], 16); |
| | | // 追加成string |
| | | string.append((char) data); |
| | | } |
| | | return string.toString(); |
| | | } |
| | | |
| | | //字符串转换成为16进制(无需Unicode编码) |
| | | public static String str2HexStr(String str) { |
| | | char[] chars = "0123456789ABCDEF".toCharArray(); |
| | | StringBuilder sb = new StringBuilder(""); |
| | | byte[] bs = str.getBytes(); |
| | | int bit; |
| | | for (int i = 0; i < bs.length; i++) { |
| | | bit = (bs[i] & 0x0f0) >> 4; |
| | | sb.append(chars[bit]); |
| | | bit = bs[i] & 0x0f; |
| | | sb.append(chars[bit]); |
| | | // sb.append(' '); |
| | | } |
| | | return sb.toString().trim(); |
| | | } |
| | | |
| | | //16进制直接转换成为字符串(无需Unicode解码) |
| | | public static String hexStr2Str(String hexStr) { |
| | | String str = "0123456789ABCDEF"; |
| | | char[] hexs = hexStr.toCharArray(); |
| | | byte[] bytes = new byte[hexStr.length() / 2]; |
| | | int n; |
| | | for (int i = 0; i < bytes.length; i++) { |
| | | n = str.indexOf(hexs[2 * i]) * 16; |
| | | n += str.indexOf(hexs[2 * i + 1]); |
| | | bytes[i] = (byte) (n & 0xff); |
| | | } |
| | | return new String(bytes); |
| | | } |
| | | |
| | | /** |
| | | * int/long转16字节字符串(按所占字节数用0补齐) |
| | | * |
| | | * @param byteLen 所占字节长度 |
| | | * @param b 需要转换的数字 |
| | | * @return str16 |
| | | */ |
| | | public static String numToStr16(int byteLen, long b) { |
| | | return String.format("%0" + byteLen * 2 + "x", b); |
| | | } |
| | | |
| | | /** |
| | | * float/double转16字节字符串(按所占字节数用0补齐) |
| | | * |
| | | * @param byteLen 所占字节长度 |
| | | * @param b 需要转换的数字 |
| | | * @return str16 |
| | | */ |
| | | public static String numToStr16(int byteLen, double b) { |
| | | byte[] bytes = Hex.getBytes(b); |
| | | int anInt = Hex.getInt(bytes); |
| | | return String.format("%0" + byteLen * 2 + "x", anInt); |
| | | } |
| | | |
| | | /** |
| | | * 16进制字符串转字符串(ASCII) |
| | | * |
| | | * @param x16 十六进制字符串 |
| | | * @return string |
| | | */ |
| | | public static String x16toString(String x16) { |
| | | if (x16 == null || "".equals(x16.trim())) { |
| | | return ""; |
| | | } |
| | | String tempStr = ""; |
| | | byte[] b = new byte[x16.length() / 2]; |
| | | for (int i = 0; i < x16.length() / 2; i++) { |
| | | tempStr = x16.substring(i * 2, i * 2 + 2); |
| | | int temp = Integer.parseInt(tempStr, 16); |
| | | b[i] = (byte) temp; |
| | | } |
| | | return new String(b, StandardCharsets.US_ASCII); |
| | | } |
| | | |
| | | /** |
| | | * 16进制字符串转字符串(GBK) |
| | | * |
| | | * @param x16 十六进制字符串 |
| | | * @return string |
| | | */ |
| | | public static String x16toGbk(String x16) { |
| | | byte[] bytes = new byte[x16.length() / 2]; |
| | | byte tempByte = 0; |
| | | byte tempHigh = 0; |
| | | byte tempLow = 0; |
| | | for (int i = 0, j = 0; i < x16.length(); i += 2, j++) { |
| | | tempByte = (byte) (((int) x16.charAt(i)) & 0xff); |
| | | if (tempByte >= 48 && tempByte <= 57) { |
| | | tempHigh = (byte) ((tempByte - 48) << 4); |
| | | } else if (tempByte >= 97 && tempByte <= 101) { |
| | | tempHigh = (byte) ((tempByte - 97 + 10) << 4); |
| | | } |
| | | tempByte = (byte) (((int) x16.charAt(i + 1)) & 0xff); |
| | | if (tempByte >= 48 && tempByte <= 57) { |
| | | tempLow = (byte) (tempByte - 48); |
| | | } else if (tempByte >= 97 && tempByte <= 101) { |
| | | tempLow = (byte) (tempByte - 97 + 10); |
| | | } |
| | | bytes[j] = (byte) (tempHigh | tempLow); |
| | | } |
| | | String result = null; |
| | | try { |
| | | result = new String(bytes, "GBK"); |
| | | } catch (UnsupportedEncodingException e) { |
| | | e.printStackTrace(); |
| | | } |
| | | return result; |
| | | } |
| | | |
| | | |
| | | public static boolean isChinese(String s) { |
| | | boolean result = false; |
| | | for (int i = 0; i < s.length(); i++) { |
| | | char c = s.charAt(i); |
| | | Character.UnicodeBlock ub = Character.UnicodeBlock.of(c); |
| | | if (ub == Character.UnicodeBlock.CJK_UNIFIED_IDEOGRAPHS |
| | | || ub == Character.UnicodeBlock.CJK_COMPATIBILITY_IDEOGRAPHS |
| | | || ub == Character.UnicodeBlock.CJK_UNIFIED_IDEOGRAPHS_EXTENSION_A |
| | | || ub == Character.UnicodeBlock.GENERAL_PUNCTUATION |
| | | || ub == Character.UnicodeBlock.CJK_SYMBOLS_AND_PUNCTUATION |
| | | || ub == Character.UnicodeBlock.HALFWIDTH_AND_FULLWIDTH_FORMS) { |
| | | result = true; |
| | | } |
| | | } |
| | | return result; |
| | | } |
| | | |
| | | private static String byteArrToHex(byte[] btArr) { |
| | | char[] strArr = new char[btArr.length * 2]; |
| | | int i = 0; |
| | | for (byte bt : btArr) { |
| | | strArr[i++] = HEX_CHAR_ARR[bt >>> 4 & 0xf]; |
| | | strArr[i++] = HEX_CHAR_ARR[bt & 0xf]; |
| | | } |
| | | return new String(strArr); |
| | | } |
| | | |
| | | private static byte[] hexToByteArr(String hexStr) { |
| | | char[] charArr = hexStr.toCharArray(); |
| | | byte[] btArr = new byte[charArr.length / 2]; |
| | | int index = 0; |
| | | for (int i = 0; i < charArr.length; i++) { |
| | | int highBit = HEX_STR.indexOf(charArr[i]); |
| | | int lowBit = HEX_STR.indexOf(charArr[++i]); |
| | | btArr[index] = (byte) (highBit << 4 | lowBit); |
| | | index++; |
| | | } |
| | | return btArr; |
| | | } |
| | | |
| | | /** |
| | | * 字符串转16进制字符串(无汉字utf-8,有汉字gbk) |
| | | * |
| | | * @param str |
| | | * @return |
| | | */ |
| | | public static String str2StrHex(String str) { |
| | | boolean chinese = isChinese(str); |
| | | if (chinese) { |
| | | try { |
| | | byte[] bytes1 = str.getBytes(StandardCharsets.UTF_8); |
| | | byte[] bytes2 = new String(bytes1, StandardCharsets.UTF_8).getBytes("gbk"); |
| | | String gbk = new String(bytes2, "gbk"); |
| | | byte[] gbkArr = gbk.getBytes(); |
| | | return byteArrToHex(gbkArr); |
| | | |
| | | } catch (UnsupportedEncodingException e) { |
| | | e.printStackTrace(); |
| | | return null; |
| | | } |
| | | } else { |
| | | return strTo16(str); |
| | | } |
| | | } |
| | | |
| | | /** |
| | | * 16进制字符串转字符串(无汉字utf-8,有汉字gbk) |
| | | * |
| | | * @param strHex |
| | | * @return |
| | | */ |
| | | public static String strHex2Str(String strHex) { |
| | | byte[] bytes = hexToByteArr(strHex); |
| | | String s1 = new String(bytes, StandardCharsets.UTF_8); |
| | | boolean chinese = isChinese(s1); |
| | | if (!chinese) { |
| | | try { |
| | | return new String(bytes, "gbk"); |
| | | } catch (UnsupportedEncodingException e) { |
| | | e.printStackTrace(); |
| | | return null; |
| | | } |
| | | } else { |
| | | return s1; |
| | | } |
| | | } |
| | | |
| | | |
| | | } |
| | | |
| | | |