4

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

假设内容是->

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 在那里只显示一个)而不是“\u00”来解决该错误,但是我没有在数组中看到真正的十六进制值,而是我看到一堆字符串,如 -> "\U008C" , "\U00D9" 等等..

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

谢谢。

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

4

3 回答 3

4

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

编辑:

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

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 );
}
于 2012-07-12T02:20:38.030 回答
0

使用 String.split 方法在 ,

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

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

EZ

于 2012-07-12T02:09:32.333 回答
0

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

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

}

为了加入他们,而不是我的System.out陈述,使用 StringBuilder 或 StringBuffer 并附加到它。

于 2012-07-12T02:10:15.570 回答