[英]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
之前修剪該前綴。
基本理念:
0000000000000000000000000A000000
0A000000
。 如關於OP的注釋中所述,十六進制字符串(如Long.parseLong()
)不以0x
。 這就是你得到NumberFormatException的原因。
有多種方法可以解決這個問題。
如果需要,刪除0x
,解析,然后將其添加回來
static String shortenHex(String input){ if(input.charAt(1)=='x') inputnput = input.substring(2); return "0x"+Long.toHexString(Long.parseLong(shortenedInput, 16)).toUpperCase(); }
如果適用,添加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.