【问题标题】:String array to Hex Array (Java)字符串数组到十六进制数组(Java)
【发布时间】:2012-07-11 17:52:55
【问题描述】:

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

假设内容是 ->

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 密钥,它是一个十六进制字符串而不是文本字符串。

【问题讨论】:

  • 所以你想要一个byte[] 作为你的输出?如果是这样,您上面的示例会产生误导,因为您正在构建一个字符串。
  • 一旦我有了十六进制字符串,我会在上面做一个 getBytes() 。
  • Unicode 转义像 "\u20ac" 是由编译器在编译时处理的,所以无论如何用"\u00" + array[j] 在代码中生成它们对你没有任何好处。我认为,Bohemian 的答案的第一部分是你所需要的。

标签: java arrays string hex hmac


【解决方案1】:

让 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 完美!我按照你的建议做了,它就像一个魅力!虽然 Bohemian 的回答也是正确的,但 cklab 的解决方案让我得到了我正在寻找的最终价值,可能后来做 getBytes() 把我搞砸了。谢谢大家:)
【解决方案2】:

使用String.split方法在,上进行拆分

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

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

EZ

【讨论】:

    【解决方案3】:

    你可以这样拆分:

    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 语句并附加到它。

    【讨论】:

      猜你喜欢
      • 2021-03-11
      • 1970-01-01
      • 2013-08-09
      • 2013-10-13
      • 1970-01-01
      • 2018-05-17
      • 2012-05-30
      • 2021-08-22
      相关资源
      最近更新 更多