Java 十六进制编码字符串到字节数组

Java 十六进制编码字符串到字节数组,java,arrays,string,bytearray,Java,Arrays,String,Bytearray,我想将str转换为字节数组,但是str.getBytes()返回32个字节,而不是16个字节 使用: String str = "9B7D2C34A366BF890C730641E6CECF6F"; 我认为提问者想要的是将十六进制值的字符串表示转换为表示该十六进制值的字节数组 ApacheCommons编解码器有一个这样的类 这应该可以做到: String s = "9B7D2C34A366BF890C730641E6CECF6F"; byte[] bytes = Hex.decode

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

使用:

String str = "9B7D2C34A366BF890C730641E6CECF6F";

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

ApacheCommons编解码器有一个这样的类


这应该可以做到:

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

JavaSE6或JavaEE5现在提供了这样做的方法,因此不需要额外的库

方法是

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

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();
}
该类还为XML中常用的许多其他格式提供类型转换。

尝试以下方法:

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

我假设你需要的是将一个十六进制字符串转换成一个字节数组,这个字节数组等于十六进制字符串的值? 添加此方法应该可以帮助您完成此操作,而无需任何额外的库导入:

     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++;
     }
公共静态字节[]十六进制字节数组(字符串s){

String[]strBytes=s.split((?我知道已经晚了,但希望它能帮助其他人

这是我的代码:它接受字符串中包含的二乘二十六进制表示,并将它们添加到字节数组中。 它对我非常有效

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;
}
public byte[]stringToByte数组(字符串s){
byte[]byteArray=新字节[s.length()/2];
String[]strBytes=新字符串[s.length()/2];
int k=0;
对于(int i=0;i
这根本不是一个bug。一些有效的java代码会很有帮助…@Andreas\u D:看看OP的问题。字符串有32个字符。此外,STring.getBytes()不会将字符串的内部表示形式返回为字节。它使用默认平台编码将字符串返回为字节数组(可能是UTF8,ISO8859-1,CP-1252,…,每ASCII字符使用1个字节)@JB Nizet-问题不包括有效的Java代码,我的解释是stringy是十六进制格式的16字节整数值。(这就是为什么我在第一条评论中建议使用有效的Java代码)好的。明白了。没有正确的问题,很难给出正确的答案。它会给出如下输出[B@405e898,但我想要与字节数组相同的Str字符串。@Qaiser Mehmood因为它是一个数组,所以您不能只打印它,您必须创建一个简单的循环来逐个打印它的元素,例如:
for(Byte b:Str.getBytes(“UTF-16LE”))系统输出打印LN(b)顺便说一下,用OP的示例字符串,它将吐出64个字节,这完全不是要求的。还有<代码> org .BooCyCoras.U.L.Engors.HEX 来做那种工作。那么什么是示例方法呢?到目前为止我遇到的这个问题的最简单解决方案-谢谢!这应该是公认的答案,因为它是只使用核心Java库的最简单解决方案。
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;
}
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;
}