在Java中通过删除前导零来缩短十六进制数
我在字符串中有十六进制数,我想通过删除前导零来缩短它。我需要用Java来做 例如:在Java中通过删除前导零来缩短十六进制数,java,hex,Java,Hex,我在字符串中有十六进制数,我想通过删除前导零来缩短它。我需要用Java来做 例如: 0000000000000000000000000A000000 -> 0x0A000000 0x0000000000000000000000000A000000 -> 0x0A000000 000000000000000000000000C0A80000 -> 0xC0A80000 0x000000000000000000000000C0A80000 -> 0xC0A80000
0000000000000000000000000A000000 -> 0x0A000000
0x0000000000000000000000000A000000 -> 0x0A000000
000000000000000000000000C0A80000 -> 0xC0A80000
0x000000000000000000000000C0A80000 -> 0xC0A80000
当前下面的代码引发NumberFormatException异常
System.out.println(Long.toHexString(Long.parseLong("0x0000000000000000000000000A000000")));
您没有正确使用
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
基本思想之前,必须修剪该前缀:
0000000000000000000A000000
中选择0A000000
正如其他人提到的,十六进制字符串不是以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));
}
如OP上的注释所述,十六进制字符串(如
Long.parseLong()
)不是以0x
开头的。这就是为什么你会有一个数字格式的异常
解决这个问题有多种方法
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+","");
}
静态字符串shortenHex(字符串输入){
if(input.charAt(1)!=“x”)input=“0x”+输入;
返回input.replaceAll(“(?如果您只需要字符串形式而不是文本形式,那么这应该可以工作
String[]十六进制={
“0000000000000000000 A000000”,
“0x0000000000000000000000000A000000”,
“000000000000000000000000C0A80000”,
“0x000000000000000000000000C0A80000”
};
for(字符串h:hex){
字符串hmod=h.replaceAll(“[0x]*([123456789ABCDEF].*”,“0x$1”);
系统输出打印LN(h+“->”+hmod);
}
看起来像他的一样。@在许多编程语言(包括Java)中,用0x
作为十六进制数前缀的Lino很常见@GyroGearless文本是前缀(int i=0xABC;
),而不是字符串AFAIK(Long.tohextstring(0x11)->11
)根据十六进制字符串的值,最好使用新的BigInteger(hex,16).toString(16)而不是Long。