有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

字符串数组到十六进制数组(Java)

我有一个字符串数组,它实际上由十六进制字符组成

假设内容为->

String array[] = {8C,D9,26,1D,69,B7,96,DB};  

现在我想把它们解释为每个1字节的十六进制字符,而不是每个条目都是2字节的字符串

StringBuilder output = new StringBuilder();
for (int j = 0; j < array.length; j++) {
        String temp = "\u00"+ array[j];
        output.append(temp);
    }

尝试过类似的方法,但不可能,因为它一直在抱怨“非法unicode越狱”。我尝试使用“\u00”(即u前面的两个反斜杠,但stackoverflow在那里只显示一个)来避免该错误,但随后我在数组中看不到真正的十六进制值,而是看到一组字符串,如->;“\U008C”、“\U00D9”等

我希望转换后的值为0x8C、0xD9、0x26

谢谢

编辑:我更新了这个问题,只是为了澄清数组本身没有逗号。最后,我需要将所有这些值放在一起,并将其用作HMAC键,它是一个十六进制字符串,而不是一个文本字符串


共 (3) 个答案

  1. # 1 楼答案

    用绳子。split方法在

    对于返回数组中的每个元素,go data[i]=“0x”+data[i]

    对于数组中的每个元素str+=data[i]

    埃兹

  2. # 2 楼答案

    您可以按如下方式拆分它:

    public static void main(String[] args) {
        String givenString = "8C,D9,26,1D,69,B7,96,DB";
        String[] splitString = givenString.split("[,]");
    
        for(int index = 0; index < splitString.length; index++){
            System.out.print("0x"+ splitString[index]);
            System.out.print((index == splitString.length - 1) ? "":",");
        }
        System.out.println();
    
    }
    

    为了加入它们,使用StringBuilder或StringBuffer并附加到它,而不是我的System.out语句

  3. # 3 楼答案

    让JDK为您完成工作:

    String[] array = {"8C", "D9", "26", "1D", "69", "B7", "96", "DB"};
    
    StringBuilder output = new StringBuilder();
    for ( String hex : array ) {
        output.append( (char)Integer.parseInt( hex, 16 ) );
    }
    

    基本上,你只需要循环中的一条线

    如果你想让你的输入仅仅是一个大字符串(这似乎更方便),只需这样做:

    String input = "8CD9261D69B796DB";
    
    StringBuilder output = new StringBuilder();
    for ( String hex : input.replaceAll( "..(?!$)", "$0," ).split( "," ) ) {
        output.append( (char)Integer.parseInt( hex, 16 ) );
    }
    

    编辑:

    如果想要字节[]结果,请执行以下操作:

    String[] array = {"8C", "D9", "26", "1D", "69", "B7", "96", "DB"};
    
    byte[] bytes = new byte[array.length];
    for ( int i = 0; i < array.length; i++ ) {
        bytes[i] = (byte)Integer.parseInt( array[i], 16 );
    }