ASCII
https://zh.wikipedia.org/wiki/ASCII
- American Standard Code for Information Interchange,美國信息交換標準代碼
- 33個控制字符和95個可見字符
控制字符
說明:
- Unicode表示法:當我們想在畫面或紙張上表示這些控制字符時,就會顯示成這個樣子。過于老舊的系統(tǒng)或瀏覽器可能會看不到。使用微軟任一中文輸入法,輸入
U2400即可看到?,輸入U2401可看到?,依此類推。 - 脫出字符表示法:通常用于終端機連接(例如Telnet通信協(xié)議),以脫出字符開頭,再接一個符號,用來讓這些控制字符得以在畫面上顯現(xiàn)。雖然看起來是兩個字符,但在終端機上實際只有一個字符。在絕大部分的終端機系統(tǒng)中,包括Windows的命令提示字符(cmd.exe)、Linux和FreeBSD,都可用Ctrl代表脫出字符,輸入想要的ASCII控制字符。例如想輸入空字符,就要輸入Ctrl+2,而非@,后者會顯示成兩字符,前者只會顯示成一字符。

image
可見字符

image
記住常用的ASCII碼
字母 十六進制
1 31
A 41
a 61
Base64
https://zh.wikipedia.org/wiki/Base64
Base64是一種基于64個可打印字符來表示二進制數(shù)據(jù)的表示方法。由于2^6=64,所以每6個比特為一個單元,對應(yīng)某個可打印字符。3個字節(jié)有24個比特,對應(yīng)于4個Base64單元,即3個字節(jié)可表示4個可打印字符。它可用來作為電子郵件的傳輸編碼。在Base64中的可打印字符包括字母A-Z、a-z、數(shù)字0-9,這樣共有62個字符,此外兩個可打印符號在不同的系統(tǒng)中而不同。
例子
Man is distinguished, not only by his reason, but by this singular passion from other animals, which is a lust of the mind, that by a perseverance of delight in the continued and indefatigable generation of knowledge, exceeds the short vehemence of any carnal pleasure.
經(jīng)過Base64編碼之后變成:
TWFuIGlzIGRpc3Rpbmd1aXNoZWQsIG5vdCBvbmx5IGJ5IGhpcyByZWFzb24sIGJ1dCBieSB0aGlz
IHNpbmd1bGFyIHBhc3Npb24gZnJvbSBvdGhlciBhbmltYWxzLCB3aGljaCBpcyBhIGx1c3Qgb2Yg
dGhlIG1pbmQsIHRoYXQgYnkgYSBwZXJzZXZlcmFuY2Ugb2YgZGVsaWdodCBpbiB0aGUgY29udGlu
dWVkIGFuZCBpbmRlZmF0aWdhYmxlIGdlbmVyYXRpb24gb2Yga25vd2xlZGdlLCBleGNlZWRzIHRo
ZSBzaG9ydCB2ZWhlbWVuY2Ugb2YgYW55IGNhcm5hbCBwbGVhc3VyZS4=
編碼
編碼Man,在此例中,Base64算法將3個字節(jié)編碼為4個字符。

image
Base64索引表:

image
如果要編碼的字節(jié)數(shù)不能被3整除,最后會多出1個或2個字節(jié),那么可以使用下面的方法進行處理:先使用0字節(jié)值在末尾補足,使其能夠被3整除,然后再進行Base64的編碼。在編碼后的Base64文本后加上一個或兩個=號,代表補足的字節(jié)數(shù)。也就是說,當最后剩余兩個八位字節(jié)(2個byte)時,最后一個6位的Base64字節(jié)塊有四位是0值,最后附加上兩個等號;如果最后剩余一個八位字節(jié)(1個byte)時,最后一個6位的base字節(jié)塊有兩位是0值,最后附加一個等號。 參考下表:

image
Java&Base64
Java如何進行Base64的編碼(Encode)與解碼(Decode)?
// java8
final Base64.Decoder decoder = Base64.getDecoder();
final Base64.Encoder encoder = Base64.getEncoder();
final String text = "字串文字";
final byte[] textByte = text.getBytes("UTF-8");
//編碼
final String encodedText = encoder.encodeToString(textByte);
System.out.println(encodedText);
//解碼
System.out.println(new String(decoder.decode(encodedText), "UTF-8"));
Shiro也提供了對Base64的操作
// org.apache.shiro.codec.Base64
String str = "hello";
String base64Encoded = Base64.encodeToString(str.getBytes());
String str2 = Base64.decodeToString(base64Encoded);
Assert.assertEquals(str, str2);