Java - 为什么 StringBuffer 需要 base64 才能得到正确的十六进制?

Java - Why StringBuffer require base64 to get correct hex?

例如这将得到 'A':

的正确十六进制值 0x41
    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 如何使其生成正确的十六进制?

关键在于没有StringBuffer.append(byte[])方法

那么当用 byte[] 参数调用 append 时会发生什么? JVM 选择下一个最合适的,即 append(Object) 每个 javadoc 执行以下操作:

The overall effect is exactly as if the argument were converted to a string by the method String.valueOf(Object), and the characters of that string were then appended to this character sequence.

所以它附加了 byte[] 的字符串表示,看起来像

[B@33db5a0 

第二种方法通过使用 String 字节数组的 Base64 表示来纠正这一点,因此选择的方法是 append(String).

作为一般规则:始终注意您在何处使用 bytes 以及在何处使用 charString,切勿对字节数组使用字符串操作。