src/share/classes/java/lang/Long.java

Print this page

        

@@ -264,18 +264,69 @@
      * @return  the string representation of the unsigned {@code long}
      *          value represented by the argument in hexadecimal
      *          (base 16).
      * @see #parseUnsignedLong(String, int)
      * @see #toUnsignedString(long, int)
+     * @see #toHexString(long, int)
      * @since   1.0.2
      */
     public static String toHexString(long i) {
         return toUnsignedString0(i, 4);
     }
 
     /**
      * Returns a string representation of the {@code long}
+     * argument as an unsigned integer in base 16, padded with
+     * leading zeroes if necessary.
+     *
+     * <p>The unsigned {@code long} value is the argument plus
+     * 2<sup>64</sup> if the argument is negative; otherwise, it is
+     * equal to the argument.  This value is converted to a string of
+     * ASCII digits in hexadecimal (base&nbsp;16) with possibly
+     * appended leading zeroes. A minimum amount of zeroes is appended
+     * to ensure the length of the resulting string is at least
+     * {@code minWidth}.
+     *
+     * <p>The value of the argument can be recovered from the returned
+     * string {@code s} by calling {@link
+     * Long#parseUnsignedLong(String, int) Long.parseUnsignedLong(s,
+     * 16)}.
+     *
+     * <p>If the unsigned magnitude is zero, it is represented by a
+     * single zero character {@code '0'} ({@code '\u005Cu0030'}).
+     * The following characters are used as hexadecimal digits:
+     *
+     * <blockquote>
+     *  {@code 0123456789abcdef}
+     * </blockquote>
+     *
+     * These are the characters {@code '\u005Cu0030'} through
+     * {@code '\u005Cu0039'} and  {@code '\u005Cu0061'} through
+     * {@code '\u005Cu0066'}.  If uppercase letters are desired,
+     * the {@link java.lang.String#toUpperCase()} method may be called
+     * on the result:
+     *
+     * <blockquote>
+     *  {@code Long.toHexString(n, 12).toUpperCase()}
+     * </blockquote>
+     *
+     * @param   i   a {@code long} to be converted to a string.
+     * @param   minWidth a minimum required length of the resulting string.
+     * @return  the string representation of the unsigned {@code long}
+     *          value represented by the argument in hexadecimal
+     *          (base&nbsp;16), padded with leading zeroes if necessary.
+     * @see #parseUnsignedLong(String, int)
+     * @see #toUnsignedString(long, int)
+     * @see #toHexString(long)
+     * @since 1.9
+     */
+    public static String toHexString(long i, int minWidth) {
+        return toUnsignedString0(i, 4, minWidth);
+    }
+
+    /**
+     * Returns a string representation of the {@code long}
      * argument as an unsigned integer in base&nbsp;8.
      *
      * <p>The unsigned {@code long} value is the argument plus
      * 2<sup>64</sup> if the argument is negative; otherwise, it is
      * equal to the argument.  This value is converted to a string of

@@ -358,10 +409,29 @@
         formatUnsignedLong(val, shift, buf, 0, chars);
         return new String(buf, true);
     }
 
     /**
+     * Format a long (treated as unsigned) into a String.
+     * @param val the value to format
+     * @param shift the log2 of the base to format in (4 for hex, 3 for octal, 1 for binary)
+     * @param minWidth the minimum width of the produced String
+     */
+    static String toUnsignedString0(long val, int shift, int minWidth) {
+        int mag = Long.SIZE - Long.numberOfLeadingZeros(val);
+        int magLen = (mag + (shift - 1)) / shift;
+        int zeroes = Math.max(Math.max(minWidth, 1) - magLen, 0);
+        char[] buf = new char[magLen + zeroes];
+
+        for (int i = 0; i < zeroes; ++i)
+            buf[i] = '0';
+        if (magLen > 0)
+            formatUnsignedLong(val, shift, buf, zeroes, magLen);
+        return new String(buf, true);
+    }
+
+    /**
      * Format a long (treated as unsigned) into a character buffer.
      * @param val the unsigned long to format
      * @param shift the log2 of the base to format in (4 for hex, 3 for octal, 1 for binary)
      * @param buf the character buffer to write to
      * @param offset the offset in the destination buffer to start at