Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/319.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在Java中通过删除前导零来缩短十六进制数_Java_Hex - Fatal编程技术网

在Java中通过删除前导零来缩短十六进制数

在Java中通过删除前导零来缩短十六进制数,java,hex,Java,Hex,我在字符串中有十六进制数,我想通过删除前导零来缩短它。我需要用Java来做 例如: 0000000000000000000000000A000000 -> 0x0A000000 0x0000000000000000000000000A000000 -> 0x0A000000 000000000000000000000000C0A80000 -> 0xC0A80000 0x000000000000000000000000C0A80000 -> 0xC0A80000

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

例如:

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

基本思想之前,必须修剪该前缀:

  • 检查溢出
  • 仅从原始长字符串中选择最后8个字符,例如从
    0000000000000000000A000000
    中选择
    0A000000
  • 添加“0x”前缀

  • 正如其他人提到的,十六进制字符串不是以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。