- 最近写通信协议相关的项目, 自己封装了一套数据转换, 主要用于数字类型跟byte[]数组的转换, 可以直接拿去使用
public final class ByteUtils {
private ByteUtils() {}
public static byte[] longToByteArr(long value, boolean isBig) {
return numberToByteArr(value, isBig, 8);
}
public static byte[] intToByteArr(int value, boolean isBig) {
return numberToByteArr(value, isBig, 4);
}
public static byte[] shortToByteArr(short value, boolean isBig) {
return numberToByteArr(value, isBig, 2);
}
public static Integer byteArrToInt(byte[] arr, boolean isBig) {
return byteArrToNumber(arr, isBig, 4).intValue();
}
public static Integer byteArrToShort(byte[] arr, boolean isBig) {
return byteArrToNumber(arr, isBig, 2).intValue();
}
public static Long byteArrToLong(byte[] arr, boolean isBig) {
return byteArrToNumber(arr, isBig, 8).longValue();
}
private static Number byteArrToNumber(byte[] arr, boolean isBig, int trim) {
if (arr == null || arr.length == 0) {
return null;
}
if (arr.length > trim) {
for (int i = trim; i < arr.length; i++) {
arr[i] = 0;
}
}
long total = 0;
for (int i = 0; i < arr.length; i++) {
long arrVal = arr[i] & 0xFF;
arrVal = isBig ? arrVal << ((arr.length - i - 1) * 8) : arrVal << ((i) * 8);
total |= arrVal;
}
return total;
}
private static byte[] numberToByteArr(Number number, boolean isBig, int trim) {
if (number == null) {
return null;
}
if (trim <= 0) {
return null;
}
long value = number.longValue();
byte[] arr = new byte[trim];
for (int i = 0; i < trim; i++) {
long val = value >> (i * 8);
val &= 0xff;
if (isBig) {
arr[trim - i - 1] = (byte) val;
} else {
arr[i] = (byte) val;
}
}
return arr;
}
}