[Java]Base64编码详解(附byte ←→hexString)

原创 2011年01月14日 10:42:00

什么是Base64?


按照RFC2045的定义,Base64被定义为:Base64内容传送编码被设计用来把任意序列 的8位字节描述为一种不易被人直接识别的形式。(The Base64 Content-Transfer-Encoding is designed to represent arbitrary sequences of octets in a form that need not be humanly readable.)

Base64有个特征就是编码后的字符串长度为4的倍数。

 

算法详解


    Base64编码要求把3个8位字节(3*8=24)转化为4个6位的字节(4*6=24),之后在6位的前面补两个0,形成8位一个字节的形式。



可以这么考虑:把8位的字节连成一串110101011100010100110011
然后每次顺序选6个出来之后再把这6二进制数前面再添加两个0,就成了一个新的字节。之后再选出6个来,再添加0,依此类推,直到24个二进制数全部被选完。
让我们来看看实际结果:



这样“张3 ”这个字符串就被Base64表示为”5^/^T3”了么?。错!
Base64编码方式并不是单纯利用转化完的内容进行编码。像’^/’字符是控制字符,并不能通过计算机显示出来,在某些场合就不能使用了。Base64有其自身的编码表:



这 也是Base64名称的由来,而Base64编码的结果不是根据算法把编码变为高两位是0而低6为代表数据,而是变为了上表的形式,如”A”就有7位, 而”a”就只有6位。表中,编码的编号对应的是得出的新字节的十进制值。因此,从表2可以得到对应的Base64编码:



这样,字符串“张3”经过编码后就成了字符串“1iUz”了。
Base64将3个字节转变为4个字节,因此,编码后的代码量(以字节为单位,下同)约比编码前的代码量多了1/3。之所以说是“约”,是因为如果代码量正好是3的整数倍,那么自然是多了1/3。但如果不是呢?
细心的人可能已经注意到了,在The Base64 Alphabet中的最后一个有一个(pad) =字符。这个字符的目的就是用来处理这个问题的。
当代码量不是3的整数倍时,代码量/3的余数自然就是2或者1。转换的时候,结果不够6位的用0来补上相应的位置,之后再在6位的前面补两个0。转换完空出的结果就用就用“=”来补位。譬如结果若最后余下的为2个字节的“张”:



这样,最后的2个字节被整理成了“1iU=”。
同理,若原代码只剩下一个字节,那么将会添加两个“=”。只有这两种情况,所以,Base64的编码最多会在编码结尾有两个“=”
至于将Base64的解码,只是一个简单的编码的逆过程,读者可以自己探讨。我将在文章的最后给出解码算法。

 

自定义编码表


Base64推荐的编码表是为了达到比较好的可视效果,采用大小写的英文字母及10个数字和三个字符。在不考虑编码后可阅读性时,改变编码表,可以达到更加好的隐密效果。

byte的无符号数值范围为0~127,这决定了encodingTable中任一数据的赋值范围为0~127,并且数据与所赋值必须保留一一映射关系,而decodingTable的数组长度为128,decodingTable的序号与值相对应的是encodingTable的值与序号。

所以自定义编码表就是:对encodingTable的数据随机赋值为0~127的数并处理好该表与decodingTable的对应关系即可。在文章最后给出的代码就是一使用打乱字符顺序的编码表。

算法实现

其实在算法详解的时候基本上已经说的很清楚了。用于程序上,除去约束判断,大概可以分为如下几步几步:
读取数据3字节用AND取前6位,放入新的变量中右移两位,高两位清0AND取第一个字节的后2位和第二个字节的前4位移位放入新变量中右移两位,清0……依此类推。
编/解码的类Java语言实现的算法:

 

附byte与hexString的互转方式:

 

Base64是用4个字节表示3个字节的内容,HexString是2个字节表示1个字节的内容。

 

 

本文内容归CSDN博客博主Sodino 所有

转载请注明出处: http://blog.csdn.net/sodino/archive/2011/01/14/6137761.aspx

相关文章推荐

Mosquitto support websocket

测试环境: 操作系统:ubuntu 12.04 32位 软件: MQTT Broker:mosquitto version 1.4.5 下载地址:http://mosquitto.org/do...

Java对图片Base64转码--HTML对Base64解码 [ Java加强版 ]

Java对图片Base64编码 package base64; import java.awt.image.BufferedImage; import java.io.Byte...

java:7种Base64编码和解码功能详解和性能比较

Java 8新特性探究(十一)Base64详解 BASE64 编码是一种常用的字符编码,在很多地方都会用到。但base64不是安全领域下的加密解密算法。能起到安全作用的效果很差,而且很容...

JAVA 使用BASE64提示Access restriction: The method 'CharacterEncoder.encodeBuffer(byte[])' is not API

JAVA 使用BASE64提示 Access restriction: The method'CharacterEncoder.encodeBuffer(byte[])' is not API (r...

c 处理基于java服务端byte[]数组接收图片( xsd__base64Binary)

背景:java端基于webservice实现服务端,c作为客户端,通过gsoap传输图片给服务端。 实现步骤: 1、c端通过服务端wsdl文件生成客户端代码,图片接收部分的结构体如下: struct ...

用Base64加解密时发现的问题(其实时java基础问题byte[]转String)

byte[]转String的正确方式,小知识容易出现大问题。Base64加解密。

Java Base64编码和解码

  • 2008年12月20日 04:04
  • 2KB
  • 下载

java-Base64编码

  • 2016年02月02日 10:35
  • 10KB
  • 下载

Base64 JAVA后台编码与JS前台解码(解决中文乱码问题)

中文通过Java后台进行Base64编码后传到前台,通过JS进行Base64解码时会出现中文乱码的问题,被这个问题也是困扰了几天,使用jquery.base64.js只能转码非中文字符,经过搜集各种方...

Base64 编码解码 Java

  • 2015年02月05日 14:42
  • 438B
  • 下载
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:[Java]Base64编码详解(附byte ←→hexString)
举报原因:
原因补充:

(最多只允许输入30个字)