View Javadoc
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  }