Почему StringBuffer требуется base64, чтобы получить правильный hex? - PullRequest
0 голосов
/ 06 июня 2018

например, это даст правильное шестнадцатеричное значение 0x41 из 'A':

    StringBuffer strBuf = new StringBuffer();
    strBuf.append(toBase64("A".getBytes()));
    String ciphertext = strBuf.toString();
    byte[] encryted_bytes = ciphertext.getBytes();
    byte[] cipherBytes = fromBase64(new String(encryted_bytes));

    StringBuilder sb = new StringBuilder();
    for (byte b : cipherBytes) {
        sb.append(String.format("%02X ", b));
    }
    Log.d("hole", "hex:" + sb.toString());

Но без base64 это получит 5B 42 40 33 33 64 62 35 61 30:

    StringBuffer strBuf = new StringBuffer();
    strBuf.append(("A".getBytes()));
    String ciphertext = strBuf.toString();
    byte[] encryted_bytes = ciphertext.getBytes();
    byte[] cipherBytes = new String(encryted_bytes).getBytes();

    StringBuilder sb = new StringBuilder();
    for (byte b : cipherBytes) {
        sb.append(String.format("%02X ", b));
    }
    Log.d("hole", "hex:" + sb.toString());

Метод base64:

public static String toBase64(byte[] bytes) {
    return Base64.encodeToString(bytes, Base64.NO_WRAP);
}

public static byte[] fromBase64(String base64) {
    return Base64.decode(base64, Base64.NO_WRAP);
}

Каков шаг второго кода генерации 5B 42 40 33 33 64 62 35 61 30?И как base64 заставляет его генерировать правильный гекс?

1 Ответ

0 голосов
/ 06 июня 2018

Важным моментом в этом является то, что не существует метода StringBuffer.append(byte[]).

Так что же происходит при вызове append с byte[] -аргументом?JVM выбирает следующее наилучшее соответствие, и это append(Object), что для каждого javadoc делает следующее:

Общий эффект такой же, как если бы аргумент был преобразован в строку с помощью метода String.valueOf (Object), и символы этой строки были затем добавлены к этой последовательности символов.

Таким образом, он добавляет String-представление byte[], которое выглядит как

[B@33db5a0 

Второй подход исправляет это, используя Base64-представление байтового массива, который является String, и, таким образом, выбранный метод - append(String).

Как правило: всегда помните, где вы работаетеbyte s и где с char или String и никогда не использовать строковые операции с байтовыми массивами.

...