编码转换在通信中非常有用,主要是因为两点:一是通信两端的计算机体系结构可能不同,存在大端和小端的问题;二是传输协议可能不支持二进制传输。有不少IT人员认为编码是密码技术的一种,实际上是错误的。本书在这里明确地告诉读者朋友, 编码不是密码技术 ,Base64编码方法也不是密码算法,它只是数据的不同表示方法。编码和密码协议在很多情况下要互相配合,所以本小节将讨论常用的编码方法。
首先来实践Base64编码,该编码非常普遍,原理不再描述,直接实践。
在使用基于邮件、网页等应用的时候,都会遇到Base64编码的情景。甚至很多人把该编码作为一种加密手段来对待。如图2-5所示。
●图2-5 Base64编码的邮件
事实上它和密码无关,只是为了方便通信传输而进行的编码,没有涉及密钥,任何人都可以对其进行解码。
代码很简单,首先定义一个字符串str。通过getBytes()来转换成字节数组,注意 这里最好指定一个转换规则,在本段代码中采用的是GBK,其对中文很友好 。
接着代码中调用了Base64.encode()对字节数组进行编码,参数是待编码的原文字节数组,返回值是编码后的结果,之后通过println()打印输出结果。
最后通过调用Base64.decode()方法对编码之后的字节数组进行解码,参数是待解码的字节数组,返回值是解码后的原文,通过println()把结果打印输出。
整个过程简单清晰。运行代码之后的结果输出如下:
Base64可以将二进制转码成可见字符以方便进行HTTP传输,但是Base64转码时会生成“+”“/”“=”这些被URL进行转码的特殊字符,导致两方面数据不一致。而通过HTTP进行传输时,“/”是一种有含义的字符。所以在用网页的get()方法进行数据通信时,地址中的编码就不能只用Base64,而要采用UrlBase64编码。下面就来实践该编码。
而BC库中的UrlBase64对此进行了包装。具体实例代码和前面的Base64编码非常相似。直接使用类UrlBase64的静态方法encode(byte[])和decode(byte[])对数据进行编码和解码,两种方法都直接返回字节数组。
注意, 如果读者不是采用JRE环境配置BC库,请在代码中添加如下两行,以正确编译和使用UrlBase64类 。
本书后面在代码实例中如果使用了BC库中的类,也用该种方法进行引用,不再特别说明。
运行代码产生如下结果: