package com.hdl.sdk.link.common.utils; import java.io.UnsupportedEncodingException; import java.nio.ByteBuffer; import java.security.InvalidAlgorithmParameterException; import java.security.InvalidKeyException; import java.security.Key; import java.security.NoSuchAlgorithmException; import java.util.ArrayList; import java.util.Arrays; import java.util.List; import javax.crypto.BadPaddingException; import javax.crypto.Cipher; import javax.crypto.IllegalBlockSizeException; import javax.crypto.NoSuchPaddingException; import javax.crypto.spec.IvParameterSpec; import javax.crypto.spec.SecretKeySpec; /** * Created by Tong on 2021/9/23. */ public class ByteUtils { public static byte[] toByteArray(List list) { Byte[] temps = list.toArray(new Byte[0]); byte[] result = new byte[temps.length]; for (int i = 0; i < result.length; i++) { result[i] = temps[i]; } return result; } public static List toByteList(byte[] bytes) { final List list = new ArrayList<>(); for (byte aByte : bytes) { list.add(aByte); } return list; } public static byte[] getRangeBytes(List list, int start, int end) { Byte[] temps = Arrays.copyOfRange(list.toArray(new Byte[0]), start, end); byte[] result = new byte[temps.length]; for (int i = 0; i < temps.length; i++) { result[i] = temps[i]; } return result; } public static byte[] copyBytes(byte bytes[], int index, int length) { byte[] result = new byte[length]; for (int i = 0; i < result.length; i++) { result[i] = bytes[index + i]; } return result; } /** * 拼接byte */ public static byte[] concatBytes(byte[] bt1, byte[] bt2) { if (bt1 == null) { return bt2; } if (bt2 == null) { return bt1; } byte[] bt3 = new byte[bt1.length + bt2.length]; System.arraycopy(bt1, 0, bt3, 0, bt1.length); System.arraycopy(bt2, 0, bt3, bt1.length, bt2.length); return bt3; } public boolean endWith(Byte[] src, byte[] target) { if (src.length < target.length) { return false; } for (int i = 0; i < target.length; i++) { if (target[target.length - i - 1] != src[src.length - i - 1]) { return false; } } return true; } public static int byteIndexOf(byte[] searched, byte[] find, int start) { boolean matched; int end = find.length - 1; int skip = 0; for (int index = start; index <= searched.length - find.length; ++index) { matched = true; if (find[0] != searched[index] || find[end] != searched[index + end]) continue; else skip++; if (end > 10) if (find[skip] != searched[index + skip] || find[end - skip] != searched[index + end - skip]) continue; else skip++; for (int subIndex = skip; subIndex < find.length - skip; ++subIndex) { if (find[subIndex] != searched[index + subIndex]) { matched = false; break; } } if (matched) { return index; } } return -1; } public static int getByteIndexOf(byte[] sources, byte[] src) { return getByteIndexOf(sources, src, 0, sources.length); } //判断一个byte数值在另外一个byte数组中对应的游标值 public static int getByteIndexOf(byte[] sources, byte[] src, int startIndex) { return getByteIndexOf(sources, src, startIndex, sources.length); } //判断一个byte数值在另外一个byte数组中对应的游标值,指定开始的游标和结束的游标位置 public static int getByteIndexOf(byte[] sources, byte[] src, int startIndex, int endIndex) { if (sources == null || src == null || sources.length == 0 || src.length == 0) { return -1; } if (endIndex > sources.length) { endIndex = sources.length; } int i, j; for (i = startIndex; i < endIndex; i++) { if (sources[i] == src[0] && i + src.length < endIndex) { for (j = 1; j < src.length; j++) { if (sources[i + j] != src[j]) { break; } } if (j == src.length) { return i; } } } return -1; } /** * 字符串to Bytes * * @param str 字符串 * @return */ public static byte[] stringToBytes(String str) { try { // 使用指定的字符集将此字符串编码为byte序列并存到一个byte数组中 return str.getBytes("utf-8"); } catch (UnsupportedEncodingException e) { e.printStackTrace(); } return new byte[]{}; } public static String byte2hex(byte[] bytes) { StringBuilder sb = new StringBuilder(); String tmp = null; for (byte b : bytes) { //将每个字节与0xFF进行与运算,然后转化为10进制,然后借助于Integer再转化为16进制 tmp = Integer.toHexString(0xFF & b); if (tmp.length() == 1) { tmp = "0" + tmp; } sb.append(tmp + " "); } return sb.toString(); } public static int bytes2int(byte[] bytes) { return bytes[3] & 0xFF | // (bytes[2] & 0xFF) << 8 | // (bytes[1] & 0xFF) << 16 | // (bytes[0] & 0xFF) << 24; // } public static byte[] intToByteArray(int i) { byte[] result = new byte[4]; result[0] = (byte) ((i >> 24) & 0xFF); result[1] = (byte) ((i >> 16) & 0xFF); result[2] = (byte) ((i >> 8) & 0xFF); result[3] = (byte) (i & 0xFF); return result; } public static int byteArrayToInt(byte[] b) { int i = (b[0] & 0xFF) * 256 * 256 * 256 + (b[1] & 0xFF) * 256 * 256 + (b[2] & 0xFF) * 256 + (b[3] & 0xFF); return i; } /** * 解密 * * @param contentByte 待解密待字符串hexStr * @param contentByte 密钥 * @return */ public static byte[] decrypt(byte[] contentByte) { try { //KEY转换 Key key = new SecretKeySpec("HDLRDCENTER1985.".getBytes(), "AES"); //解密 Cipher cipher = Cipher.getInstance("AES/CBC/PKCS7Padding"); IvParameterSpec ivps = new IvParameterSpec("HDLRDCENTER1985.".getBytes()); cipher.init(Cipher.DECRYPT_MODE, key, ivps); byte[] result = cipher.doFinal(contentByte); return result; } catch (NoSuchAlgorithmException e) { LogUtils.e(e.getMessage()); } catch (InvalidKeyException e) { LogUtils.e(e.getMessage()); } catch (NoSuchPaddingException e) { LogUtils.e(e.getMessage()); } catch (BadPaddingException e) { LogUtils.e(e.getMessage()); } catch (IllegalBlockSizeException e) { LogUtils.e(e.getMessage()); } catch (InvalidAlgorithmParameterException e) { LogUtils.e(e.getMessage()); } return null; } }