package com.hdl.photovoltaic.utils;
|
|
import com.hdl.sdk.link.common.utils.LogUtils;
|
|
import java.io.UnsupportedEncodingException;
|
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<Byte> 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<Byte> toByteList(byte[] bytes) {
|
final List<Byte> list = new ArrayList<>();
|
for (byte aByte : bytes) {
|
list.add(aByte);
|
}
|
return list;
|
|
}
|
|
public static byte[] getRangeBytes(List<Byte> 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;
|
}
|
|
|
|
}
|