package android.car.utils;
import android.text.TextUtils;
public class NumberUtils {
public static int byteArrayFind(byte[] srcArr, int srcStart, int srcEnd, byte[] findArr, int findStart, int findEnd)
throws IllegalArgumentException {
int pos = -1;
if (srcStart < 0 || findStart < 0 || srcEnd < 0 || findEnd < 0) {
throw new IllegalArgumentException("ByteArrayFind: array size or offset < 0 !!");
}
if (srcArr.length < srcEnd || findArr.length < findEnd) {
throw new IllegalArgumentException("ByteArrayFind: array size out of range!");
}
int findSize = findEnd - findStart;
if (findSize == 0)
return srcStart;
for (int i = srcStart; i < srcEnd - findSize + 1; ++i) {
int cmp = byteArrayCompare(srcArr, i, findArr, findStart, findSize);
if (cmp == 0) {
pos = i;
break;
}
}
return pos;
}
public static int byteArrayFind(byte[] srcArr, int srcStart, int srcEnd, byte findByte)
throws IllegalArgumentException {
int pos = -1;
if (srcArr == null || srcStart < 0 || srcEnd <= 0 || srcArr.length < srcEnd) {
throw new IllegalArgumentException("ByteArrayFind: array arg error !!");
}
for (int i = srcStart; i < srcEnd; ++i) {
if (srcArr[i] == findByte) {
pos = i;
break;
}
}
return pos;
}
public static int byteArrayCompare(byte[] srcArr, int srcStart, byte[] dstArr, int dstStart, int cmpSize) {
int cmp;
for (int i = 0; i < cmpSize; ++i) {
cmp = srcArr[srcStart + i] - dstArr[dstStart + i];
if (cmp != 0) {
return cmp;
}
}
return 0;
}
public static String byteToHexString(byte b, boolean upperCase) {
int high = (b >> 4) & 0xF;
int low = b & 0xF;
if (upperCase) {
char[] str = {
HEX_UPPER_CHAR_TABLE[high], HEX_UPPER_CHAR_TABLE[low]
};
return new String(str);
} else {
char[] str = {
HEX_LOWER_CHAR_TABLE[high], HEX_LOWER_CHAR_TABLE[low]
};
return new String(str);
}
}
static final char[] HEX_UPPER_CHAR_TABLE = {
'0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'A', 'B', 'C', 'D', 'E', 'F'
};
static final char[] HEX_LOWER_CHAR_TABLE = {
'0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'a', 'b', 'c', 'd', 'e', 'f'
};
public static String byteArrayToHexString(byte[] arr, int offset, int size, String split) {
if (arr == null || offset < 0 || size < 0 || offset + size > arr.length) {
throw new IllegalArgumentException("ByteArrayToHexString arg error!");
}
if (size == 0) {
return "";
}
StringBuilder sb = new StringBuilder(size * 4);
sb.append(byteToHexString(arr[0], true));
for (int i = 1; i < size; i++) {
sb.append(split);
sb.append(byteToHexString(arr[offset + i], true));
}
return sb.toString();
}
public static String byteArrayToHexString(byte[] arr, String split) {
return byteArrayToHexString(arr, 0, arr.length, split);
}
static final String[] BINARY_STRING_TABLE = {
"0000", "0001", "0010", "0011", "0100", "0101", "0110", "0111", "1000", "1001", "1010", "1011", "1100",
"1101", "1110", "1111"
};
public static String byteToBinaryString(byte b) {
int high = (b >> 4) & 0xF;
int low = b & 0xF;
return BINARY_STRING_TABLE[high] + BINARY_STRING_TABLE[low];
}
public static String byteArrayToBinaryString(byte[] arr, int offset, int size, String split) {
if (arr == null || offset < 0 || size < 0 || offset + size > arr.length) {
throw new IllegalArgumentException("ByteArrayToHexString arg error!");
}
if (size == 0) {
return "";
}
StringBuilder sb = new StringBuilder(size * 4);
sb.append(byteToBinaryString(arr[0]));
for (int i = 1; i < size; i++) {
sb.append(split);
sb.append(byteToBinaryString(arr[offset + i]));
}
return sb.toString();
}
public static String byteArrayToBinaryString(byte[] arr, String split) {
return byteArrayToBinaryString(arr, 0, arr.length, split);
}
public static byte[] intArrayToByteArray(int[] array) {
byte[] byteArr = new byte[array.length];
for (int i = 0; i < array.length; i++) {
byteArr[i] = (byte) (array[i] & 0xFF);
}
return byteArr;
}
public static void intWriteToByteArray(int value, byte[] arr, int offset) {
arr[offset] = (byte) (value & 0xFF);
arr[offset + 1] = (byte) (value >> 8 & 0xFF);
arr[offset + 2] = (byte) (value >> 16 & 0xFF);
arr[offset + 3] = (byte) (value >> 24 & 0xFF);
}
public static int makeIntByByte(int b3, int b2, int b1, int b0) {
return (b3 & 0xFF) << 24 | (b2 & 0xFF) << 16 | (b1 & 0xFF) << 8 | (b0 & 0xFF);
}
public static int makeIntByByte(byte b3, byte b2, byte b1, byte b0) {
return (b3 & 0xFF) << 24 | (b2 & 0xFF) << 16 | (b1 & 0xFF) << 8 | (b0 & 0xFF);
}
public static int makeIntByShort(int h, int l) {
return (h & 0xFFFF) << 16 | (l & 0xFFFF);
}
public static int makeIntByShort(short h, short l) {
return (h & 0xFFFF) << 16 | (l & 0xFFFF);
}
public static short makeShort(int h, int l) {
return (short) ((h & 0xFF) << 8 | (l & 0xFF));
}
public static short makeShort(byte h, byte l) {
return (short) ((h & 0xFF) << 8 | (l & 0xFF));
}
public static long makeLongByInt(int h, int l) {
return (long) ((h & 0xFFFFFFFF) << 32 | (l & 0xFFFFFFFF));
}
public static long makeLongByShort(short s3, short s2, short s1, short s0) {
return (s3 & 0xFFFF) << 24 | (s2 & 0xFFFF) << 16 | (s1 & 0xFFFF) << 8 | (s0 & 0xFFFF);
}
public static long makeLongByByte(byte b7, byte b6, byte b5, byte b4, byte b3, byte b2, byte b1, byte b0) {
return ((b7 & 0xFF) << 56 | (b6 & 0xFF) << 48 | (b5 & 0xFF) << 40 | (b4 & 0xFF) << 32 | (b3 & 0xFF) << 24
| (b2 & 0xFF) << 16 | (b1 & 0xFF) << 8 | (b0 & 0xFF));
}
public static boolean testBit(byte val, int bitPos) {
return (val & (1 << bitPos)) == (1 << bitPos);
}
public static boolean testBit(short val, int bitPos) {
return (val & (1 << bitPos)) == (1 << bitPos);
}
public static boolean testBit(int val, int bitPos) {
return (val & (1 << bitPos)) == (1 << bitPos);
}
public static boolean testBit(long val, int bitPos) {
return (val & (1 << bitPos)) == (1 << bitPos);
}
public static int setBit(int val, int bitPos) {
return val | (1 << bitPos);
}
public static int clearBit(int val, int bitPos) {
return val & ~(1 << bitPos);
}
public static boolean isInRange(int val, int min, int max) {
return val >= min && val <= max;
}
public static boolean isInRange(float val, float min, float max) {
return val >= min && val <= max;
}
public static boolean isInRange(byte val, byte min, byte max) {
return val >= min && val <= max;
}
public static boolean isInRange(char val, char min, char max) {
return val >= min && val <= max;
}
public static boolean isInRange(long val, long min, long max) {
return val >= min && val <= max;
}
static final int[] BITS_MASK = {
0x0000, 0x0001, 0x0003, 0x0007, 0x000F, 0x001F, 0x003F, 0x007F, 0x00FF, 0x01FF, 0x03FF, 0x07FF, 0x0FFF,
0x1FFF, 0x3FFF, 0x7FFF, 0xFFFF, 0x0001FFFF, 0x0003FFFF, 0x0007FFFF, 0x000FFFFF, 0x001FFFFF, 0x003FFFFF,
0x007FFFFF, 0x00FFFFFF, 0x01FFFFFF, 0x03FFFFFF, 0x07FFFFFF, 0x0FFFFFFF, 0x1FFFFFFF, 0x3FFFFFFF, 0x7FFFFFFF,
0xFFFFFFFF
};
public static int getBitsValue(int val, int bitPos, int bitCount) {
if (bitCount >= 0 && bitCount < BITS_MASK.length) {
return val >> bitPos & BITS_MASK[bitCount];
}
throw new IllegalArgumentException("count must be 0~32");
}
public static int getBitsValue(byte val, int bitPos, int bitCount) {
if (bitCount >= 0 && bitCount < BITS_MASK.length) {
return val >> bitPos & BITS_MASK[bitCount];
}
throw new IllegalArgumentException("count must be 0~32");
}
public static int setBitsValue(int srcVal, int bitPos, int bitCount, int setVal) {
if (bitCount >= 0 && bitCount < BITS_MASK.length) {
return (srcVal & ~(BITS_MASK[bitCount] << bitPos)) | ((setVal & BITS_MASK[bitCount]) << bitPos);
}
throw new IllegalArgumentException("count must be 0~32");
}
public static int getByteValue(int val, int pos) {
return (val >> pos * 8) & 0xFF;
}
public static int getLowShort(int val) {
return val & 0xFFFF;
}
public static int getHighShort(int val) {
return (val >> 16) & 0xFFFF;
}
public static int getLowWord(int val) {
return val & 0xFFFF;
}
public static int getHighWord(int val) {
return (val >> 16) & 0xFFFF;
}
public static int getByteValue(long val, int pos) {
return (int) ((val >> pos * 8) & 0xFF);
}
public static int getLowInt(long val) {
return (int) (val & 0xFFFFFFFF);
}
public static int getHighInt(long val) {
return (int) ((val >> 32) & 0xFFFFFFFF);
}
public static int fixRange(int val, int min, int max) {
if (min > max) {
int tmp = min;
min = max;
max = tmp;
}
if (val < min)
return min;
if (val > max)
return max;
return val;
}
public static long fixRange(long val, long min, long max) {
if (min > max) {
long tmp = min;
min = max;
max = tmp;
}
if (val < min)
return min;
if (val > max)
return max;
return val;
}
public static byte fixRange(byte val, byte min, byte max) {
if (min > max) {
byte tmp = min;
min = max;
max = tmp;
}
if (val < min)
return min;
if (val > max)
return max;
return val;
}
public static char fixRange(char val, char min, char max) {
if (min > max) {
char tmp = min;
min = max;
max = tmp;
}
if (val < min)
return min;
if (val > max)
return max;
return val;
}
public static float fixRange(float val, float min, float max) {
if (min > max) {
float tmp = min;
min = max;
max = tmp;
}
if (val < min)
return min;
if (val > max)
return max;
return val;
}
public static double fixRange(double val, double min, double max) {
if (min > max) {
double tmp = min;
min = max;
max = tmp;
}
if (val < min)
return min;
if (val > max)
return max;
return val;
}
public static boolean parseBoolean(String str, boolean def) {
boolean result = def;
if (str != null) {
if (str.length() == 1) {
char ch = str.charAt(0);
if (ch == '0' || ch == 'n' || ch == 'N')
result = false;
else if (ch == '1' || ch == 'y' || ch == 'Y')
result = true;
} else if (str.length() > 1) {
if ("yes".equalsIgnoreCase(str) || "true".equalsIgnoreCase(str) || "on".equalsIgnoreCase(str)) {
result = true;
} else if ("no".equalsIgnoreCase(str) || "false".equalsIgnoreCase(str) || "off".equalsIgnoreCase(str)) {
result = false;
}
}
}
return result;
}
public static int parseInt(String str, int def) {
int result = def;
if (!TextUtils.isEmpty(str)) {
try {
return Integer.parseInt(str);
} catch (Exception e) {
}
}
return result;
}
public static int parseInt(String str, int radix, int def) {
int result = def;
if (!TextUtils.isEmpty(str)) {
try {
return Integer.parseInt(str, radix);
} catch (Exception e) {
}
}
return result;
}
public static int integerDecode(String str, int def) {
int result = def;
if (!TextUtils.isEmpty(str)) {
try {
return Integer.decode(str);
} catch (Exception e) {
}
}
return result;
}
public static int[] parseIntList(String str, String regx) {
if (TextUtils.isEmpty(regx) || TextUtils.isEmpty(str)) {
return null;
}
String[] strList = str.split(regx);
int[] intList = new int[strList.length];
for (int i = 0; i < strList.length; ++i) {
intList[i] = integerDecode(strList[i], 0);
}
return intList;
}
public static byte[] cstringBytesToJstringBytes(byte[] bytes, int offset, int len) {
if ((offset | len) < 0 || bytes.length < offset + len) {
throw new ArrayIndexOutOfBoundsException();
}
int size = 0;
for (int i = offset, last = offset + len - 1; i <= last; i++) {
if (bytes[i] == 0 /* '\0' */) break;
size++;
}
byte[] result = new byte[size];
System.arraycopy(bytes, offset, result, 0, size);
return result;
}
}