【问题标题】:Shortening the Hex number by removing leading zeros in Java通过删除 Java 中的前导零来缩短十六进制数
【发布时间】:2019-06-06 12:55:14
【问题描述】:

我在字符串中有可用的十六进制数,我想通过删除前导零来缩短它。我需要用 Java 来做

例如:

0000000000000000000000000A000000   -> 0x0A000000
0x0000000000000000000000000A000000 -> 0x0A000000

000000000000000000000000C0A80000   -> 0xC0A80000
0x000000000000000000000000C0A80000 -> 0xC0A80000

目前下面的代码抛出 NumberFormatException 异常

System.out.println(Long.toHexString(Long.parseLong("0x0000000000000000000000000A000000")));

【问题讨论】:

  • 看起来像他的。
  • @Lino 在十六进制数字前加上 0x 在许多编程语言(包括 Java)中很常见
  • @GyroGearless 文字有前缀 (int i = 0xABC;),但不是字符串 AFAIK (Long.toHexString(0x11) -> 11)

标签: java hex


【解决方案1】:

正如其他人所提到的,十六进制字符串不以 0x 开头,这只是 hexadecimal literals 的前缀。

实现您想要的一种可能性如下:

void foo(String myString) {
    /*
        Here we're making myString upper case and checking if it begins w/ 0x.
        If the string starts with 0X, that'll be replaced with an empty string.
    */
    if ((myString = myString.ToUpperCase()).startsWith("0X")) {
        myString = myString.replace("0X", "");
    }

    String parsedHex = Long.toHexString(Long.parseLong(myString, 16 /* This is the radix (base) of the number. In this case we want hex (16) */));
    System.out.println(String.format("0x%s%s", parsedHex.length() % 2 == 0 ? "" : "0" /* If it's an odd number, add a leading zero. */, parsedHex));

}

【讨论】:

    【解决方案2】:

    你没有正确使用Long.parseLong

    应该是:

    System.out.println(Long.toHexString(Long.parseLong("0000000000000000000000000A000000",16)));
    

    但这会导致

    a000000
    

    这不是你想要的。

    您必须添加一些额外的格式才能获得您想要的确切输出:

    String shortHex = Long.toHexString(Long.parseLong("0000000000000000000000000A000000",16)).toUpperCase ();
    String formatted = (shortHex.length () % 2 == 0 ? "0x":"0x0") + shortHex;
    System.out.println (formatted);
    

    现在输出将是:

    0x0A000000
    

    如果您的输入以“0x”开头,则您必须在调用 parseLong 之前修剪该前缀。

    【讨论】:

    • 根据十六进制字符串的值,最好使用 new BigInteger(hex, 16).toString(16) 而不是 Long。
    【解决方案3】:

    基本思路:

    1. 检查溢出
    2. 仅从原始长字符串中挑选最后 8 个字符,例如0A000000 来自0000000000000000000000000A000000
    3. 添加“0x”前缀。

    【讨论】:

      【解决方案4】:

      正如对 OP 的评论中所述,十六进制字符串(如 Long.parseLong() 所见)不以 0x 开头。这就是您收到 NumberFormatException 的原因。

      有多种方法可以解决这个问题。

      1. 如果需要,删除0x,解析,然后添加回来

        static String shortenHex(String input){
            if(input.charAt(1)=='x') inputnput = input.substring(2);
            return "0x"+Long.toHexString(Long.parseLong(shortenedInput, 16)).toUpperCase();
        }
        
      2. 如果适用,添加0x,然后使用正则表达式

        static String  shortenHex(String input){
            if(input.charAt(1)!= 'x') input = "0x"+input;
            return input.replaceAll("(?<=0x)0+","");
        }
        

      【讨论】:

        【解决方案5】:

        如果你只想要字符串形式而不是文字形式,那么这应该可以。

              String[] hex = {
                    "0000000000000000000000000A000000",
                    "0x0000000000000000000000000A000000",
                    "000000000000000000000000C0A80000",
                    "0x000000000000000000000000C0A80000"
              };
        
              for (String h : hex) {
                 String hmod = h.replaceAll("[0x]*([123456789ABCDEF].*)", "0x$1");
                 System.out.println(h + " -> " + hmod);
              }
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2013-08-05
          • 2019-10-20
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2013-05-10
          相关资源
          最近更新 更多