字符数转十六进制字符串

4

你好,我想要构建一个随机的16位十六进制字符串,我尝试使用Long.toHexString(new Random().nextLong()来实现,我的假设是它总是会返回一个16位的字符串,我是对的吗?(有时会返回15位)


2
你应该阅读 Long.toHexString 的 Javadoc 以了解它返回的内容。 - wero
请注意,根据文档(https://docs.oracle.com/javase/7/docs/api/java/util/Random.html#nextLong())所述,Random.nextLong()将不会生成所有可能的long值范围内的随机long值,这意味着您可能无法通过这种方式获取十六进制字符串的每个可能组合。这可能对您有影响,也可能没有影响,但值得注意。 - Neil
这与我所询问的机制无关,这里重要的不是随机值,而是为其分配的空间。 ;) - user3392362
2个回答

10

首先,参考所涉及方法的Javadoc是您的第一选择:

此值将转换为十六进制(基数16)的ASCII数字字符串,没有额外的前导0。

因此,并不总是16个字符长度。

但是,您可以使用以下代码打印一个带有前导零的16个字符的大写十六进制字符串:

String.format("%016X", longValue)

10

请查看toHexString(long i)的javadocs(强调我的)。

public static String toHexString(long i)

以十六进制(基数为16)无符号整数形式返回一个long类型参数的字符串表示形式。

如果参数为负,则无符号长整型值为该参数加2的64次方;否则,它等于该参数本身。将该值转换为十六进制(基数为16)的ASCII数字字符串时不需要额外的前导零。如果无符号幅值为零,则由单个零字符'0'('\u0030')表示;否则,无符号幅值的表示中第一个字符不是零字符。

事实证明,它并不总是长度为16个字符。但是,如果您想要补零,可以这样做:

import java.util.Random;

class Main {
    public static void main(String[] args) {
        String hex16Chars = String.format("%016X", new Random().nextLong());
        System.out.println(hex16Chars + ", len: " + hex16Chars.length());
    }
}

你会发现长度始终如预期的那样为16。

而且事实证明偷看文档确实有帮助! :)


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接