十六进制编码字符串转换为字节数组

37
String str = "9B7D2C34A366BF890C730641E6CECF6F";

我想将str转换成字节数组,但是str.getBytes()返回的是32个字节而不是16个。


4
这根本不是漏洞。 - Buhake Sindi
1
一些有效的Java代码会很有帮助... - Andreas Dolk
@JB Nizet - 我很确定,该字符串有16个字符,每个字符都编码为16位。这导致 - 仍然不是很惊讶 - 32字节。Java在内部使用UTF16,1个字符=2个字节。 - Andreas Dolk
1
@Andreas_D:看一下原帖的问题。这个字符串有32个字符。此外,String.getBytes()不会返回字符串作为字节的内部表示形式。它将使用默认平台编码(可能是UTF8、ISO8859-1、CP-1252等),将字符串作为字节数组返回,每个ASCII字符使用1个字节。 - JB Nizet
1
@JB Nizet - 这个问题并没有包含有效的Java代码,而且是我自己的理解,字符串的东西 是一个以十六进制格式表示的16字节整数值。(这就是为什么我在我的第一条评论中推荐使用有效的Java代码) - Andreas Dolk
1
好的。明白了。没有正确的问题,很难给出正确的答案。 - JB Nizet
7个回答

56

我认为提问者想要将十六进制值的字符串表示转换为表示该十六进制值的字节数组。

Apache Commons-Codec有一个专门用于此目的的类,叫做Hex

String s = "9B7D2C34A366BF890C730641E6CECF6F";    
byte[] bytes = Hex.decodeHex(s.toCharArray());

3
还有org.bouncycastle.util.encoders.Hex可以完成那种工作。 - Timofey Gorshkov
考虑你需要自己编写代码,那么一个例子方法是什么? - Michahell

38

现在Java SE 6或Java EE 5提供了一种方法来做到这一点,因此不需要额外的库。

该方法是DatatypeConverter.parseHexBinary

在这种情况下,可以按以下方式使用:

String str = "9B7D2C34A366BF890C730641E6CECF6F";
byte[] bytes = DatatypeConverter.parseHexBinary(str);

该类还提供了许多其他通常用于XML中的格式的类型转换。


2
到目前为止,我遇到的这个问题最简单的解决方案 - 谢谢! - mh.
6
这应该是被接受的答案,因为它是利用核心Java库的最简单解决方案。 - MTCoster

5

使用:

str.getBytes("UTF-16LE");

它输出类似于[B@405e898,但我希望得到与之相同的Str字符串作为Byte Array。 - Qaiser Mehmood
@Qaiser Mehmood 因为它是一个数组,所以你不能直接打印它,你必须使用一个简单的循环来逐个打印它的元素。 - Eng.Fouad
对于字符串编码为UTF-16LE的每个字节b,执行以下操作:System.out.println(b); - Eng.Fouad
1
那并不能将十六进制字符串转换为相应的字节。它将把任何字符串转换为其UTF16编码。顺便说一句,对于OP的示例字符串,它将产生64个字节,这完全不是请求的结果。 - dim

2

我知道现在有点晚了,但是希望这能对其他人有所帮助...

以下是我的代码:它将包含在字符串中的两个十六进制表示形式添加到字节数组中。对我来说运行得非常完美。

public byte[] stringToByteArray (String s) {
    byte[] byteArray = new byte[s.length()/2];
    String[] strBytes = new String[s.length()/2];
    int k = 0;
    for (int i = 0; i < s.length(); i=i+2) {
        int j = i+2;
        strBytes[k] = s.substring(i,j);
        byteArray[k] = (byte)Integer.parseInt(strBytes[k], 16);
        k++;
    }
    return byteArray;
}

0

应该就可以了:

byte[] bytes = toByteArray(Str.toCharArray());

public static byte[] toByteArray(char[] array) {
    return toByteArray(array, Charset.defaultCharset());
}

public static byte[] toByteArray(char[] array, Charset charset) {
    CharBuffer cbuf = CharBuffer.wrap(array);
    ByteBuffer bbuf = charset.encode(cbuf);
    return bbuf.array();
}

0

我猜你需要的是将十六进制字符串转换为字节数组,使其与该十六进制字符串具有相同的含义?添加以下方法即可完成,无需导入任何额外的库:

public static byte[] hexToByteArray(String s) {
     String[] strBytes = s.split("(?<=\\G.{2})");
     byte[] bytes = new byte[strBytes.length];
     for(int i = 0; i < strBytes.length; i++)
         bytes[i] = (byte)Integer.parseInt(strBytes[i], 16);
     return bytes;
}

0

试试这个:

     String str = "9B7D2C34A366BF890C730641E6CECF6F";
     String[] temp = str.split(",");
     bytesArray = new byte[temp.length];
     int index = 0;
     for (String item: temp) {
     bytesArray[index] = Byte.parseByte(item);
     index++;
     }

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