簡體   English   中英

通過刪除Java中的前導零來縮短十六進制數

[英]Shortening the Hex number by removing leading zeros in Java

我有字符串中的十六進制數字,我想通過刪除前導零來縮短它。 我需要用Java來做

例如 :

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

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

目前下面的代碼拋出NumberFormatException異常

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

正如其他人所提到的,十六進制字符串不以0x開頭,這只是十六進制文字的前綴。

實現您想要的一種可能性如下:

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));

}

您沒有正確使用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之前修剪該前綴。

基本理念:

  1. 檢查溢出
  2. 僅從原始長字符串中選取最后8個字符,例如從0000000000000000000000000A000000 0A000000
  3. 添加“0x”前綴。

如關於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+",""); } 

如果你只想要字符串形式而不是文字形式,那么這應該有效。

      String[] hex = {
            "0000000000000000000000000A000000",
            "0x0000000000000000000000000A000000",
            "000000000000000000000000C0A80000",
            "0x000000000000000000000000C0A80000"
      };

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM