content: package im.actor.keygen;
  
  public class Hex {
  
      final protected static char[] HEXES_SMALL = "0123456789abcdef".toCharArray();
  
      private static final String HEXES = "0123456789ABCDEF";
  
      public static String toHex(byte[] raw) {
          final StringBuilder hex = new StringBuilder(2 * raw.length);
          for (final byte b : raw) {
              hex.append(HEXES.charAt((b & 0xF0) >> 4)).append(HEXES.charAt((b & 0x0F)));
          }
          return hex.toString();
      }
  
  
      /**
       * Calculating lowcase hex string
       *
       * @param bytes data for hex
       * @return hex string
       */
      public static String hex(byte[] bytes) {
          char[] hexChars = new char[bytes.length * 2];
          for (int j = 0; j < bytes.length; j++) {
              int v = bytes[j] & 0xFF;
              hexChars[j * 2] = HEXES_SMALL[v >>> 4];
              hexChars[j * 2 + 1] = HEXES_SMALL[v & 0x0F];
          }
          return new String(hexChars);
      }
  
      private static int fromHexShort(char a) {
          if (a >= '0' && a <= '9') {
              return a - '0';
          }
          if (a >= 'a' && a <= 'f') {
              return 10 + (a - 'a');
          }
  
          throw new RuntimeException();
      }
  
      public static byte[] fromHex(String hex) {
          byte[] res = new byte[hex.length() / 2];
          for (int i = 0; i < res.length; i++) {
              res[i] = (byte) ((fromHexShort(hex.charAt(i * 2)) << 4) + fromHexShort(hex.charAt(i * 2 + 1)));
          }
          return res;
      }
  }
  