用Java格式转换十六进制字符串值的最有效方法

问题描述 投票:0回答:1

我有以下 Java 代码,它增加十六进制值的值并使用以下格式返回字符串(其中

x
是递增的十六进制值,
7
是文字):

xxxx-7xxx-xxxx

该值从左到右递增,由 12 个字符组成:

0000-7000-0001
0000-7000-0002
...
0000-7fff-ffff
0001-7000-0000

代码:

public class GeneratorTemplate {
    private static final AtomicLong COUNTER = new AtomicLong(0);

    public static String generateTemplate() {
        // incrementing the counter
        long currentValue = COUNTER.getAndIncrement();

        // get 11 character (not 12 because 7 is a literal and appended) hex value represented as string
        String rawResult = String.format("%011X", currentValue & 0xFFFFFFFFFFFL);

        // append and format values
        return (rawResult.substring(0, 4) +
                "-7" +
                rawResult.substring(4, 7) +
                "-" +
                rawResult.substring(7)).toLowerCase();

    }

    public static void main(String[] args) {
        for (int i = 0; i < 3; i++) {
            System.out.println(generateTemplate());
        }
    }
}

它有效,但我确信这效率不高。

性能问题围绕着我手动附加

7
、连字符和小写字母这一事实。我认为,如果我用
format()
方法执行此操作,我将获得性能提升。另外,代码会更清晰

我试图用一行来完成这一任务,但没有成功。这段代码显然是不正确的,我想知道如何正确使用

format()
方法,这样我就不必手动附加任何内容:

return String.format("%04X-7%03X-%04X", currentValue & 0xFFFFL, currentValue & 0xFFFL, currentValue & 0xFFFFL);

任何人都可以澄清这是否可以使用

format()
方法来实现,以及参数中
F
的数量代表什么(我显然明白这是十六进制,但应该有多少个
F's
)?

谢谢

java string hex string-formatting
1个回答
0
投票

使用 String.format() 方法,因此您可以直接格式化十六进制值,而无需手动附加段。您需要在 String.format() 中使用正确的位操作和格式化。

import java.util.concurrent.atomic.AtomicLong;

public class GeneratorTemplate {
    private static final AtomicLong COUNTER = new AtomicLong(0);

    public static String generateTemplate() {
        // Increment the counter
        long currentValue = COUNTER.getAndIncrement();

        // Use bit manipulation and formatting to generate the desired output
        return String.format("%04X-7%03X-%04X", 
                (currentValue >> 40) & 0xFFFF,  // Extract the first 4 hex digits
                (currentValue >> 28) & 0xFFF,   // Extract the next 3 hex digits
                (currentValue & 0xFFFFF));      // Extract the last 5 hex digits
    }

    public static void main(String[] args) {
        for (int i = 0; i < 3; i++) {
            System.out.println(generateTemplate());
        }
    }
}

位操作:

(>>):将位向右移动,丢弃右侧的位并用零填充左侧以进行无符号移位。

currentValue >> 40 通过向右移动 40 位来提取前 4 个十六进制数字。

currentValue >> 28 通过向右移动 28 位来提取接下来的 3 个十六进制数字。

currentValue & 0xFFFFF 提取最后 5 个十六进制数字。

String.format():

“%04X”将第一个段格式化为 4 个十六进制数字宽。

“%03X”将第二段格式化为 3 个十六进制数字宽。

“%04X”将第三段格式化为 4 个十六进制数字宽。

上述代码的输出是:

output

© www.soinside.com 2019 - 2024. All rights reserved.