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

Print this page

        

*** 264,281 **** --- 264,332 ---- * @return the string representation of the unsigned {@code long} * value represented by the argument in hexadecimal * (base&nbsp;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&nbsp;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,367 **** --- 409,437 ---- 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