我正在實施一個Cipher Block Chaining學校工作和問題要求的方法採取String
並返回另一String
。起初,我認爲這很奇怪,並且變量會更加適合,但仍然實施了一種方法。基本上,這裏是代碼:Java字節[]到字符串和UTF-8
static public String encode(String message) {
byte[] dataMessage = message.getBytes();
ByteArrayOutputStream out = new ByteArrayOutputStream();
byte last = (byte) (Math.random() * 256);
byte cur;
out.write(last);
for (byte b : data) {
cur = (byte) (b^last);
System.out.println("Encode '" + (char) b + "' = " + b + "^" + last + " > " + cur);
out.write(cur);
last = cur;
}
System.out.println("**ENCODED BYTES = " + Arrays.toString(out.toByteArray()));
System.out.println("**ENCODED STR = " + Arrays.toString(out.toString().getBytes()));
return out.toString();
}
decode
方法的工作原理類似。有些時候,方法會吐出像
Encode 'H' = 72^109 > 37
Encode 'e' = 101^37 > 64
Encode 'l' = 108^64 > 44
Encode 'l' = 108^44 > 64
Encode 'o' = 111^64 > 47
**ENCODED BYTES = [109, 37, 64, 44, 64, 47]
**ENCODED STR = [109, 37, 64, 44, 64, 47]
結果,但有時也會吐的東西像
Encode 'H' = 72^-63 > -119
Encode 'e' = 101^-119 > -20
Encode 'l' = 108^-20 > -128
Encode 'l' = 108^-128 > -20
Encode 'o' = 111^-20 > -125
**ENCODED BYTES = [-63, -119, -20, -128, -20, -125]
**ENCODED STR = [-17, -65, -67, -17, -65, -67, -17, -65, -67, -17, -65, -67]
我相信,這已經是與UTF-8(該系統的默認編碼),但我不夠熟悉究竟是爲什麼這樣的字符串會返回給定的字節。
是的,它替換每個字符序列(它們中的四個,UTF-8具有自同步屬性,使其跳過看起來像下一個多字節字符的開頭)被替換爲U + FFFD REPLACEMENT CHARACTER在UTF8中:0xef 0xbf 0xbd)。 – ninjalj
是的,這是我認爲會發生的事情(關於替換角色)。然後我將使用Base64實現。 –