Как преобразовать непечатаемый символ или строку в шестнадцатеричное? - PullRequest
0 голосов
/ 25 января 2011

У меня есть строка, которая содержит следующую шестнадцатеричную презентацию: "5f e8 d0 7b c0 f7 54 07 fb e4 20 f5 b8 10 67 a9"

Вы понимаете, что это всего лишь шестнадцатеричный формат, и мне нужно получить это шестнадцатеричное представление от String. Строка выглядит так: "ED> @@ 2.W.W'KJ% z_ {T g"

Итак, как получить из "ED> @@ 2.W.W'KJ% z_ {T g" шестнадцатеричное представление "5f e8 d0 7b c0 f7 54 07 fb e4 20 f5 b8 10 67 a9"? Это непечатные символы, поэтому я не могу использовать это: public static String stringToHex(String arg) { return String.format("%x", new BigInteger(arg.getBytes())); } результат: -10404282104042104042104042104042104042c7eea21040428189104042104042f5. А также это возвращает мне что-то странное: System.out.println(String.format("%h", Integer.toHexString(buff.charAt(0)))); результат: 6d1.

И этот код иногда работает. Данные поступают из сокета (как String, потому что мне нужно получить много ответов в виде String и только этот Auth Challenge в виде hex).

1 Ответ

4 голосов
/ 25 января 2011

Это правильное решение:

public static String toHexString(byte[] bytes) {  
    StringBuilder out = new StringBuilder();
    for (byte b: bytes) {
        out.append(String.format("%02X", b) + " ");
    }
    return out.toString();
}

Решение с Integer.toHexString() неверно по следующим причинам:

  1. Не добавляет начальный ноль к байту 0x01 -0x0F
  2. Печатает байты 0x80 - 0xFF как отрицательные целые числа в представлении дополнения 2
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...