Merge "Change StreamUtil from DatatypeConverter to bytesToHexString"
diff --git a/src/com/android/tradefed/util/StreamUtil.java b/src/com/android/tradefed/util/StreamUtil.java
index eee61b4..a904fd6 100644
--- a/src/com/android/tradefed/util/StreamUtil.java
+++ b/src/com/android/tradefed/util/StreamUtil.java
@@ -33,11 +33,10 @@
 import java.security.DigestInputStream;
 import java.security.MessageDigest;
 import java.security.NoSuchAlgorithmException;
+import java.util.Objects;
 import java.util.zip.GZIPOutputStream;
 import java.util.zip.ZipOutputStream;
 
-import javax.xml.bind.DatatypeConverter;
-
 /**
  * Utility class for managing input streams.
  */
@@ -309,7 +308,29 @@
             // Read through the stream to update digest.
         }
         input.close();
-        String md5 = DatatypeConverter.printHexBinary(md.digest()).toLowerCase();
+        String md5 = bytesToHexString(md.digest());
         return md5;
     }
+
+    private static final char[] HEX_CHARS = {
+        '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'a', 'b', 'c', 'd', 'e', 'f'
+    };
+
+    /**
+     * Converts a byte array into a String of hexadecimal characters.
+     *
+     * @param bytes an array of bytes
+     * @return hex string representation of bytes array
+     */
+    private static String bytesToHexString(byte[] bytes) {
+        Objects.requireNonNull(bytes);
+        StringBuilder sb = new StringBuilder(2 * bytes.length);
+        for (int i = 0; i < bytes.length; i++) {
+            int b = 0x0f & (bytes[i] >> 4);
+            sb.append(HEX_CHARS[b]);
+            b = 0x0f & bytes[i];
+            sb.append(HEX_CHARS[b]);
+        }
+        return sb.toString();
+    }
 }