Преобразование строки в шестнадцатеричный в Java - PullRequest
102 голосов
/ 29 мая 2009

Я пытаюсь преобразовать строку типа «testing123» в шестнадцатеричной форме в Java. В настоящее время я использую BlueJ.

И чтобы преобразовать его обратно, это то же самое, что и назад?

Ответы [ 20 ]

185 голосов
/ 27 января 2010

Вот короткий способ преобразовать его в гекс:

public String toHex(String arg) {
    return String.format("%040x", new BigInteger(1, arg.getBytes(/*YOUR_CHARSET?*/)));
}
61 голосов
/ 15 октября 2010

Чтобы гекс всегда был длиной 40 символов, BigInteger должен быть положительным:

public String toHex(String arg) {
  return String.format("%x", new BigInteger(1, arg.getBytes(/*YOUR_CHARSET?*/)));
}
41 голосов
/ 24 января 2012
import org.apache.commons.codec.binary.Hex;
...

String hexString = Hex.encodeHexString(myString.getBytes(/* charset */));

http://commons.apache.org/codec/apidocs/org/apache/commons/codec/binary/Hex.html

18 голосов
/ 29 мая 2009

Числа, которые вы кодируете в шестнадцатеричном формате, должны представлять некоторую кодировку символов, например UTF-8. Поэтому сначала преобразуйте строку в байт [], представляющий строку в этой кодировке, а затем преобразуйте каждый байт в шестнадцатеричный.

public static String hexadecimal(String input, String charsetName) throws UnsupportedEncodingException {
    if (input == null) throw new NullPointerException();
    return asHex(input.getBytes(charsetName));
}

private static final char[] HEX_CHARS = "0123456789abcdef".toCharArray();

public static String asHex(byte[] buf)
{
    char[] chars = new char[2 * buf.length];
    for (int i = 0; i < buf.length; ++i)
    {
        chars[2 * i] = HEX_CHARS[(buf[i] & 0xF0) >>> 4];
        chars[2 * i + 1] = HEX_CHARS[buf[i] & 0x0F];
    }
    return new String(chars);
}
14 голосов
/ 02 мая 2016

Использование DatatypeConverter.printHexBinary():

public static String toHexadecimal(String text) throws UnsupportedEncodingException
{
    byte[] myBytes = text.getBytes("UTF-8");

    return DatatypeConverter.printHexBinary(myBytes);
}

Пример использования:

System.out.println(toHexadecimal("Hello StackOverflow"));

Печать:

48656C6C6F20537461636B4F766572666C6F77

Примечание : это вызывает немного больше проблем с Java 9 и новее, поскольку API не включен по умолчанию. Для справки, например см. этот GitHub выпуск.

8 голосов
/ 11 апреля 2012

Здесь другое решение

public static String toHexString(byte[] ba) {
    StringBuilder str = new StringBuilder();
    for(int i = 0; i < ba.length; i++)
        str.append(String.format("%x", ba[i]));
    return str.toString();
}

public static String fromHexString(String hex) {
    StringBuilder str = new StringBuilder();
    for (int i = 0; i < hex.length(); i+=2) {
        str.append((char) Integer.parseInt(hex.substring(i, i + 2), 16));
    }
    return str.toString();
}
8 голосов
/ 16 августа 2013

Все ответы, основанные на String.getBytes (), включают кодировку вашей строки в соответствии с Charset. Вы не обязательно получите шестнадцатеричное значение 2-байтовых символов , составляющих вашу строку. Если то, что вы на самом деле хотите, является эквивалентом шестнадцатеричной программы просмотра, то вам необходимо получить прямой доступ к символам. Вот функция, которую я использую в своем коде для отладки проблем Unicode:

static String stringToHex(String string) {
  StringBuilder buf = new StringBuilder(200);
  for (char ch: string.toCharArray()) {
    if (buf.length() > 0)
      buf.append(' ');
    buf.append(String.format("%04x", (int) ch));
  }
  return buf.toString();
}

Затем stringToHex ("testing123") выдаст вам:

0074 0065 0073 0074 0069 006e 0067 0031 0032 0033
6 голосов
/ 29 мая 2009

Я бы предложил что-то вроде этого, где str - ваша входная строка:

StringBuffer hex = new StringBuffer();
char[] raw = tokens[0].toCharArray();
for (int i=0;i<raw.length;i++) {
    if     (raw[i]<=0x000F) { hex.append("000"); }
    else if(raw[i]<=0x00FF) { hex.append("00" ); }
    else if(raw[i]<=0x0FFF) { hex.append("0"  ); }
    hex.append(Integer.toHexString(raw[i]).toUpperCase());
}
5 голосов
/ 19 ноября 2013

Преобразование буквы в шестнадцатеричный код и шестнадцатеричный код в букву.

        String letter = "a";
    String code;
    int decimal;

    code = Integer.toHexString(letter.charAt(0));
    decimal = Integer.parseInt(code, 16);

    System.out.println("Hex code to " + letter + " = " + code);
    System.out.println("Char to " + code + " = " + (char) decimal);
5 голосов
/ 29 мая 2009
byte[] bytes = string.getBytes(CHARSET); // you didn't say what charset you wanted
BigInteger bigInt = new BigInteger(bytes);
String hexString = bigInt.toString(16); // 16 is the radix

В этот момент вы можете вернуть hexString с оговоркой, что начальные нулевые символы будут удалены, и результат будет иметь нечетную длину, если первый байт меньше 16. Если вам нужно обработать эти случаи, Вы можете добавить дополнительный код на панель с 0s:

StringBuilder sb = new StringBuilder();
while ((sb.length() + hexString.length()) < (2 * bytes.length)) {
  sb.append("0");
}
sb.append(hexString);
return sb.toString();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...