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)
.
作为一般规则:始终注意您在何处使用 byte
s 以及在何处使用 char
或 String
,切勿对字节数组使用字符串操作。
例如这将得到 '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)
.
作为一般规则:始终注意您在何处使用 byte
s 以及在何处使用 char
或 String
,切勿对字节数组使用字符串操作。