2012-01-17 2 views
30

Я использую ниже функцию в Java, чтобы преобразовать зашифрованную строку в шестнадцатеричный формат:В Java, как преобразовать шестнадцатеричную строку в байт []?

public static String toHex(byte [] buf) { 
    StringBuffer strbuf = new StringBuffer(buf.length * 2); 
    int i; 
    for (i = 0; i < buf.length; i++) { 
     if (((int) buf[i] & 0xff) < 0x10) { 
      strbuf.append("0"); 
     } 
     strbuf.append(Long.toString((int) buf[i] & 0xff, 16)); 
    } 
    return strbuf.toString(); 
} 

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

Например,

(1) Plain Text = 123 
(2) Encrypted Text = «h>kq*«¬Mí“~èåZ \}? 
(3) Encrypted Text in Hex = f263575e7b00a977a8e9a37e08b9c215feb9bfb2f992b2b8f11e 

Я могу перейти от (2) к (3), но как я иду от (3) назад (2)?

+0

aa to Ra. Один фильм не камал чхе. вы можете присоединиться ко мне в моей комнате чата http://chat.stackoverflow.com/rooms/6137/ – Lucifer

+2

Что такое массив обратного байта? Это отличается от массива байтов? –

+0

Нет, это так же, как byte []. –

ответ

40
String s="f263575e7b00a977a8e9a37e08b9c215feb9bfb2f992b2b8f11e"; 
byte[] b = new BigInteger(s,16).toByteArray(); 
+5

Это не дало мне результат, который я искал, но простой однострочный метод в ответе dARKpRINCE. –

+0

'cs.setBytes (1, новый BigInteger (regReportId, 16) .toByteArray());' Это сработало, когда мне пришлось передать тип данных RAW в Oracle sproc – Dilip

+0

«Новый BigInteger (s, 16) .toByteArray() ; 'неверно. Я ввожу шестнадцатеричную строку длиной 34 длины и выводят байты длиной 18. То, что я хочу, это байты длиной 17 длины. – Ninja

86

Принятая ответ не считает ведущие нули, которые могут вызвать проблемы

This question отвечает ему. В зависимости от того, хотите ли вы посмотреть, как это делается или просто использовать встроенный метод java. Ниже приведены решения, скопированные из this и this ответов соответственно из упомянутого вопроса SO.

Вариант 1: метод Util

public static byte[] hexStringToByteArray(String s) { 
    int len = s.length(); 
    byte[] data = new byte[len/2]; 
    for (int i = 0; i < len; i += 2) { 
     data[i/2] = (byte) ((Character.digit(s.charAt(i), 16) << 4) 
          + Character.digit(s.charAt(i+1), 16)); 
    } 
    return data; 
} 

Вариант 2: Однострочник встроенного

import javax.xml.bind.DatatypeConverter; 

public static String toHexString(byte[] array) { 
    return DatatypeConverter.printHexBinary(array); 
} 

public static byte[] toByteArray(String s) { 
    return DatatypeConverter.parseHexBinary(s); 
} 
+0

ваш ответ поможет мне с http://stackoverflow.com/a/25790612/173149, спасибо +1 – gavenkoa

+0

+1 для варианта с одним слоем, используя классы, уже поставляемые с Java. – Zeimyth

+0

Отличный ответ, хотелось бы, чтобы я мог повышать свою репутацию не один раз. –

5

Я обнаружил, что DatatypeConverter.parseHexBinary является более дорогостоящим (два раза) чем:

org.apache.commons.codec.binary.Hex(str.toCharArray())