ASCII&Base64

ASCII

https://zh.wikipedia.org/wiki/ASCII

  • American Standard Code for Information Interchange,美国信息交换标准代码
  • 33个控制字符和95个可见字符

控制字符

说明:

  • Unicode表示法:当我们想在画面或纸张上表示这些控制字符时,就会显示成这个样子。过于老旧的系统或浏览器可能会看不到。使用微软任一中文输入法,输入U2400即可看到␀,输入U2401可看到␁,依此类推。
  • 脱出字符表示法:通常用于终端机连接(例如Telnet通信协议),以脱出字符开头,再接一个符号,用来让这些控制字符得以在画面上显现。虽然看起来是两个字符,但在终端机上实际只有一个字符。在绝大部分的终端机系统中,包括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个可打印字符来表示二进制数据的表示方法。由于2^6=64,所以每6个比特为一个单元,对应某个可打印字符。3个字节有24个比特,对应于4个Base64单元,即3个字节可表示4个可打印字符。它可用来作为电子邮件的传输编码。在Base64中的可打印字符包括字母A-Z、a-z、数字0-9,这样共有62个字符,此外两个可打印符号在不同的系统中而不同。

例子

举例来说,一段引用自托马斯·霍布斯利维坦》的文句:

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.

经过Base64编码之后变成:

TWFuIGlzIGRpc3Rpbmd1aXNoZWQsIG5vdCBvbmx5IGJ5IGhpcyByZWFzb24sIGJ1dCBieSB0aGlz
IHNpbmd1bGFyIHBhc3Npb24gZnJvbSBvdGhlciBhbmltYWxzLCB3aGljaCBpcyBhIGx1c3Qgb2Yg
dGhlIG1pbmQsIHRoYXQgYnkgYSBwZXJzZXZlcmFuY2Ugb2YgZGVsaWdodCBpbiB0aGUgY29udGlu
dWVkIGFuZCBpbmRlZmF0aWdhYmxlIGdlbmVyYXRpb24gb2Yga25vd2xlZGdlLCBleGNlZWRzIHRo
ZSBzaG9ydCB2ZWhlbWVuY2Ugb2YgYW55IGNhcm5hbCBwbGVhc3VyZS4=

编码

编码Man,在此例中,Base64算法将3个字节编码为4个字符。

image

Base64索引表:

image

如果要编码的字节数不能被3整除,最后会多出1个或2个字节,那么可以使用下面的方法进行处理:先使用0字节值在末尾补足,使其能够被3整除,然后再进行Base64的编码。在编码后的Base64文本后加上一个或两个=号,代表补足的字节数。也就是说,当最后剩余两个八位字节(2个byte)时,最后一个6位的Base64字节块有四位是0值,最后附加上两个等号;如果最后剩余一个八位字节(1个byte)时,最后一个6位的base字节块有两位是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);

推荐阅读更多精彩内容

  • 在说常见的字符编码(ASCII、gb2312、gbk、utf-8等)之前,我们先来看看编码的历史吧。 编码编年史 ...
    craneyuan阅读 512评论 4 4
  • CTF中那些脑洞大开的编码和加密 0x00 前言 正文开始之前先闲扯几句吧,玩CTF的小伙伴也许会遇到类似这样的问...
    查无此人asdasd阅读 5,132评论 0 19
  • 0x01 目录 常见编码: ASCII编码 Base64/32/16编码 shellcode编码 Quoted-p...
    H0f_9阅读 9,883评论 2 17
  • 可以看我的博客 lmwen.top 或者订阅我的公众号 简介有稍微接触python的人就会知道,python中...
    ayuLiao阅读 2,769评论 1 5
  • 端午假期就该交的作业,拖到了现在。此时,仍然不知道要写些什么。就是那种感觉,蹲在厕所里,想拉却怎么拉都拉不出来。 ...
    静恰恰阅读 472评论 0 2
  • 微商霸屏,代购齐飞,我抵抗住了价格的优惠、功效的吹捧、养生的讲解、朋友的信赖,没有从任何一个微商购买东西,更没有成...
    余青遥阅读 262评论 0 0
  • 我拖着疲惫的身体挤上了地铁,掏出手机的时候,屏幕上坐着一只通体发光的黄色小怪物。圆滚滚毛茸茸的身子挎着小包,眼睛b...
    笨NANA阅读 188评论 0 0