Шестнадцатеричное кодирование строки в байтовый массив - PullRequest
33 голосов
/ 11 июля 2011
String str = "9B7D2C34A366BF890C730641E6CECF6F";

Я хочу преобразовать str в байтовый массив, но str.getBytes() возвращает 32 байта вместо 16.

Ответы [ 7 ]

52 голосов
/ 11 июля 2011

Я думаю, что задающий вопрос преобразует строковое представление шестнадцатеричного значения в байтовый массив, представляющий это шестнадцатеричное значение.

Кодекс Apache commons-codec для этого имеет класс Hex .

String s = "9B7D2C34A366BF890C730641E6CECF6F";    
byte[] bytes = Hex.decodeHex(s.toCharArray());
36 голосов
/ 07 ноября 2012

Java SE 6 или Java EE 5 предоставляют метод, позволяющий сделать это сейчас, поэтому нет необходимости в дополнительных библиотеках.

Метод: DatatypeConverter.parseHexBinary

В этом случае его можно использовать следующим образом:

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

Класс также предоставляет преобразования типов для многих других форматов, которые обычно используются в XML.

6 голосов
/ 11 июля 2011

Использование:

str.getBytes("UTF-16LE");
1 голос
/ 26 января 2015

Я знаю, что уже поздно, но надеюсь, что это поможет кому-то еще ...

Это мой код: он принимает два-два шестнадцатеричных представления, содержащихся в String, и добавляет их в массив байтов.Это прекрасно работает для меня.

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 голосов
/ 14 июля 2014

Я предполагаю, что вам нужно преобразовать шестнадцатеричную строку в байтовый массив, равный, что означает то же самое, что и шестнадцатеричная строка? Добавление этого метода должно сделать это за вас, без дополнительного импорта библиотеки:

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 голосов
/ 28 декабря 2012

попробуйте это:

     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++;
     }
0 голосов
/ 11 июля 2011

Это должно сработать:

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