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

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只显示一个)来避免该错误,但是然后我看不到数组中的真正十六进制值,而是看到一堆字符串,如->“\ U008C”,“\ U00D9”等。
我希望转换后的值为0x8C、0xD9、0x26等。
谢谢。
编辑:我已经更新了问题,只是为了澄清数组本身没有逗号。最终我需要将所有这些值放在一起,将其用作HMAC密钥,它是一个十六进制字符串,而不是文本字符串。

所以你想要一个 byte[] 作为输出?如果是这样的话,你上面的例子就有误导性了,因为你正在构建一个字符串。 - cklab
一旦我准备好十六进制字符串,我会对其执行getBytes()。 - highflyer
Unicode转义符号(如"\u20ac")由编译器在编译时处理,因此在代码中使用"\u00" + array[j]生成它们也没有任何好处。我认为Bohemian的回答的前半部分是你需要的。 - David Conrad
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 );
}

@highflyer 既然你需要一个 byte[],你可以使用 Integer.valueOf(hex, 16).byteValue(); 直接转换为字节,而不是创建一个 String 再转换为 byte[] - cklab
@cklab 太棒了!我按照你建议的做了,结果非常好!虽然 Bohemian 的答案也是正确的,但是 cklab 的解决方案给了我最终想要的值,可能后来执行 getBytes() 函数时出了问题。谢谢大家 :) - highflyer

0
使用String.split方法在逗号上进行分割。
对于返回数组中的每个元素,执行data[i] = "0x" + data[i];
对于数组中的每个元素,执行str += data[i]。
简单易行。

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并将其附加到其中。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接