1 package edu.jiangxin.apktoolbox.convert.protobuf.unsupervised;
2
3 import java.nio.ByteOrder;
4
5 public class ByteUtil {
6
7 public static int bytesToInt(byte[] bytes) {
8 return bytesToInt(bytes, ByteOrder.LITTLE_ENDIAN);
9 }
10
11 public static int bytesToInt(byte[] bytes, ByteOrder byteOrder) {
12 return bytesToInt(bytes, 0, byteOrder);
13 }
14
15 public static float bytesToFloat(byte[] bytes) {
16 return bytesToFloat(bytes, ByteOrder.LITTLE_ENDIAN);
17 }
18
19 private static float bytesToFloat(byte[] bytes, ByteOrder byteOrder) {
20 return Float.intBitsToFloat(bytesToInt(bytes, byteOrder));
21 }
22
23 public static double bytesToDouble(byte[] bytes) {
24 return bytesToDouble(bytes, ByteOrder.LITTLE_ENDIAN);
25 }
26
27 public static double bytesToDouble(byte[] bytes, ByteOrder byteOrder) {
28 return Double.longBitsToDouble(bytesToLong(bytes, byteOrder));
29 }
30
31 public static long bytesToLong(byte[] bytes) {
32 return bytesToLong(bytes, ByteOrder.LITTLE_ENDIAN);
33 }
34
35 public static long bytesToLong(byte[] bytes, ByteOrder byteOrder) {
36 return bytesToLong(bytes, 0, byteOrder);
37 }
38
39 public static long bytesToLong(byte[] bytes, int start, ByteOrder byteOrder) {
40 long values = 0;
41 if (ByteOrder.LITTLE_ENDIAN == byteOrder) {
42 for (int i = (Long.BYTES - 1); i >= 0; i--) {
43 values <<= Byte.SIZE;
44 values |= (bytes[i + start] & 0xff);
45 }
46 } else {
47 for (int i = 0; i < Long.BYTES; i++) {
48 values <<= Byte.SIZE;
49 values |= (bytes[i + start] & 0xff);
50 }
51 }
52
53 return values;
54 }
55
56 public static int bytesToInt(byte[] bytes, int start, ByteOrder byteOrder) {
57 if (ByteOrder.LITTLE_ENDIAN == byteOrder) {
58 return bytes[start] & 0xFF |
59 (bytes[1 + start] & 0xFF) << 8 |
60 (bytes[2 + start] & 0xFF) << 16 |
61 (bytes[3 + start] & 0xFF) << 24;
62 } else {
63 return bytes[3 + start] & 0xFF |
64 (bytes[2 + start] & 0xFF) << 8 |
65 (bytes[1 + start] & 0xFF) << 16 |
66 (bytes[start] & 0xFF) << 24;
67 }
68
69 }
70
71 public static String bytesToHex(byte[] bytes) {
72 StringBuilder hexString = new StringBuilder(2 * bytes.length);
73 for (byte b : bytes) {
74 hexString.append(String.format("%02X", b));
75 }
76 return hexString.toString();
77 }
78
79 public static byte[] hex2bytes(String hexString) {
80 String fixedHexString;
81 if (hexString.length() % 2 != 0) {
82 fixedHexString = hexString + "0";
83 } else {
84 fixedHexString = hexString;
85 }
86 int len = fixedHexString.length();
87 byte[] data = new byte[len / 2];
88
89 for (int i = 0; i < len-1; i += 2) {
90 data[i / 2] = (byte) ((Character.digit(fixedHexString.charAt(i), 16) << 4)
91 + Character.digit(fixedHexString.charAt(i + 1), 16));
92 }
93
94 return data;
95 }
96 }