`

base64_encode和base64_decode的JAVA实现

阅读更多
Base64是网络上最常见的用于传输8Bit字节代码的编码方式之一,大家可以查看RFC2045~RFC2049,上面有MIME的详细规范。 Base64要求把每三个8Bit的字节转换为四个6Bit的字节(3*8 = 4*6 = 24),然后把6Bit再添两位高位0,组成四个8Bit的字节,也就是说,转换后的字符串理论上将要比原来的长1/3

php 的函数:base64_encode() 和 base64_decode()

base64的编,解码原理

Base64 编码其实是将3个8位字节转换为4个6位字节,( 3*8 = 4*6 = 24 ) 这4个六位字节 其实仍然是8位,只不过高两位被设置为0. 当一个字节只有6位有效时,它的取值空间为0 到 2的6次方减1 即63,也就是说被转换的Base64编码的每一个编码的取值空间为(0~63) 。

事实上,0~63之间的ASCII码有许多不可见字符,所以应该再做一个映射,映射表为

'A' ~ 'Z' ? ASCII(0 ~ 25)

'a' ~ 'z' ? ASCII(26 ~ 51)

'0' ~ '9' ? ASCII(52 ~ 61)

' ' ? ASCII(62)

'/' ? ASCII(63)

这样就可以将3个8位字节,转换为4个可见字符。

具体的字节拆分方法为:(图(画得不好,领会精神 :-))

aaaaaabb ccccdddd eeffffff    //abcdef其实就是1或0,为了看的清楚就用abcdef代替

~~~~~~~~ ~~~~~~~~ ~~~~~~~~

字节 1 字节 2 字节 3

    ||
    \/

00aaaaaa 00bbcccc 00ddddee 00ffffff

注:上面的三个字节位原文,下面四个字节为Base64编码,其前两位均为0。

这样拆分的时候,原文的字节数量应该是3的倍数,当这个条件不能满足时,用全零字节

补足,转化时Base64编码用=号代替,这就是为什么有些Base64编码以一个或两个等号结

束的原因,但等号最多有两个,因为:如果F(origin)代表原文的字节数,F(remain)代

表余数,则

F(remain) = F(origin) MOD 3 成立。

所以F(remain)的可能取值为0,1,2.

如果设 n = [F(origin) – F(remain)] / 3

当F(remain) = 0 时,恰好转换为4*n个字节的Base64编码。

当F(remain) = 1 时,由于一个原文字节可以拆分为属于两个Base64编码的字节,为了

让Base64编码是4的倍数,所以应该为补2个等号。

当F(remain) = 2 时,由于两个原文字节可以拆分为属于3个Base64编码的字节,同理,

应该补上一个等号。

base64 编码后的字符串末尾会有0到2个等号,这些等号在解码是并不必要,所以可以删除。
在网络GET 和 POST参数列表的时候,‘+’不能正常传输,可以把它替换成‘|’
这样经过base64编码后的字符串就只有‘|’和‘/‘,所以经过这样处理base64编码的字符串可以作为参数列表的以个参数值来传输

========================================================================
以下是老外写的一个实现:
package   com.meterware.httpunit;
/********************************************************************************************************************
*   $Id:   Base64.java,v   1.4   2002/12/24   15:17:17   russgold   Exp   $
*
*   Copyright   (c)   2000-2002   by   Russell   Gold
*
*   Permission   is   hereby   granted,   free   of   charge,   to   any   person   obtaining   a   copy   of   this   software   and   associated  
*   documentation   files   (the   "Software "),   to   deal   in   the   Software   without   restriction,   including   without   limitation  
*   the   rights   to   use,   copy,   modify,   merge,   publish,   distribute,   sublicense,   and/or   sell   copies   of   the   Software,   and
*   to   permit   persons   to   whom   the   Software   is   furnished   to   do   so,   subject   to   the   following   conditions:
*
*   The   above   copyright   notice   and   this   permission   notice   shall   be   included   in   all   copies   or   substantial   portions  
*   of   the   Software.
*
*   THE   SOFTWARE   IS   PROVIDED   "AS   IS ",   WITHOUT   WARRANTY   OF   ANY   KIND,   EXPRESS   OR   IMPLIED,   INCLUDING   BUT   NOT   LIMITED   TO
*   THE   WARRANTIES   OF   MERCHANTABILITY,   FITNESS   FOR   A   PARTICULAR   PURPOSE   AND   NONINFRINGEMENT.   IN   NO   EVENT   SHALL   THE
*   AUTHORS   OR   COPYRIGHT   HOLDERS   BE   LIABLE   FOR   ANY   CLAIM,   DAMAGES   OR   OTHER   LIABILITY,   WHETHER   IN   AN   ACTION   OF
*   CONTRACT,   TORT   OR   OTHERWISE,   ARISING   FROM,   OUT   OF   OR   IN   CONNECTION   WITH   THE   SOFTWARE   OR   THE   USE   OR   OTHER
*   DEALINGS   IN   THE   SOFTWARE.
*
*******************************************************************************************************************/

/**
  *   A   utility   class   to   convert   to   and   from   base   64   encoding.
  *
  *   @author   <a   href= "mailto:russgold@httpunit.org "> Russell   Gold </a>
  **/
public   class   Base64   {

        final   static   String   encodingChar   =   "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/ ";


        /**
          *   Returns   the   base   64   encoded   equivalent   of   a   supplied   string.
          *   @param   source   the   string   to   encode
          */
        public   static   String   encode(   String   source   )   {
                char[]   sourceBytes   =   getPaddedBytes(   source   );
                int   numGroups   =   (sourceBytes.length   +   2)   /   3;
                char[]   targetBytes   =   new   char[4];
                char[]   target   =   new   char[   4   *   numGroups   ];

                for   (int   group   =   0;   group   <   numGroups;   group++)   {
                        convert3To4(   sourceBytes,   group*3,   targetBytes   );
                        for   (int   i   =   0;   i   <   targetBytes.length;   i++)   {
                                target[   i   +   4*group   ]   =   encodingChar.charAt(   targetBytes[i]   );
                        }
                }

                int   numPadBytes   =   sourceBytes.length   -   source.length();

                for   (int   i   =   target.length-numPadBytes;   i   <   target.length;   i++)   target[i]   =   '= ';
                return   new   String(   target   );
        }


        private   static   char[]   getPaddedBytes(   String   source   )   {
                char[]   converted   =   source.toCharArray();
                int   requiredLength   =   3   *   ((converted.length+2)   /3);
                char[]   result   =   new   char[   requiredLength   ];
                System.arraycopy(   converted,   0,   result,   0,   converted.length   );
                return   result;
        }


        private   static   void   convert3To4(   char[]   source,   int   sourceIndex,   char[]   target   )   {
                target[0]   =   (char)   (   source[   sourceIndex   ]   > > >   2);
                target[1]   =   (char)   (((source[   sourceIndex       ]   &   0x03)   < <   4)   |   (source[   sourceIndex+1   ]   > > >   4));
                target[2]   =   (char)   (((source[   sourceIndex+1   ]   &   0x0f)   < <   2)   |   (source[   sourceIndex+2   ]   > > >   6));
                target[3]   =   (char)   (     source[   sourceIndex+2   ]   &   0x3f);
        }


        /**
          *   Returns   the   plaintext   equivalent   of   a   base   64-encoded   string.
          *   @param   source   a   base   64   string   (which   must   have   a   multiple   of   4   characters)
          */
        public   static   String   decode(   String   source   )   {
                if   (source.length()%4   !=   0)   throw   new   RuntimeException(   "valid   Base64   codes   have   a   multiple   of   4   characters "   );
                int   numGroups   =   source.length()   /   4;
                int   numExtraBytes   =   source.endsWith(   "== "   )   ?   2   :   (source.endsWith(   "= "   )   ?   1   :   0);
                byte[]   targetBytes   =   new   byte[   3*numGroups   ];
                byte[]   sourceBytes   =   new   byte[4];
                for   (int   group   =   0;   group   <   numGroups;   group++)   {
                        for   (int   i   =   0;   i   <   sourceBytes.length;   i++)   {
                                sourceBytes[i]   =   (byte)   Math.max(   0,   encodingChar.indexOf(   source.charAt(   4*group+i   )   )   );
                        }
                        convert4To3(   sourceBytes,   targetBytes,   group*3   );
                }
                return   new   String(   targetBytes,   0,   targetBytes.length   -   numExtraBytes   );
        }


        private   static   void   convert4To3(   byte[]   source,   byte[]   target,   int   targetIndex   )   {
                target[   targetIndex     ]     =   (byte)   ((   source[0]   < <   2)   |   (source[1]   > > >   4));
                target[   targetIndex+1   ]   =   (byte)   (((source[1]   &   0x0f)   < <   4)   |   (source[2]   > > >   2));
                target[   targetIndex+2   ]   =   (byte)   (((source[2]   &   0x03)   < <   6)   |   (source[3]));
        }

}


---------------------------
分享到:
评论

相关推荐

    JavaScript版的PHP函数base64_encode与base64_decode

    用JavaScript实现PHP里的Base64编码与解码。 使用方法: encode64('要编码的字符串'); decode64('要解码的字符串');

    delphi2010 base64_encode&decode

    标题"delphi2010 base64_encode&decode"指的是使用Delphi 2010编程环境实现的Base64编码和解码功能。Delphi是一款强大的面向对象的集成开发环境(IDE),主要用于编写Windows应用程序,其语法基于Pascal语言。 描述...

    JS 版本的base64函数实现(base64encode,base64decode)

    用js实现的base64encode,base64decode函数. 包括: function base64encode(str) { function base64decode(str) { function utf16to8(str) { function utf8to16(str) { function doit() {

    base64_encode_decode.exe

    base64_encode_decode

    php中base64_decode与base64_encode加密解密函数实例

    base64_encode语法:string base64_decode(string data); 复制代码 代码如下:$str=’d3d3LmpiNTEubmV0IOiEmuacrOS5i+Wutg==’; //定义字符串 echo base64_decode($str); //输出解码后的内容 bas

    BASE64Encoder及BASE64Decoder的源码

    在Java中,`java.util.Base64`类提供了Base64编码和解码的功能。`Base64.Encoder`接口代表Base64编码器,而`Base64.Decoder`接口代表Base64解码器。你可以通过`Base64.getEncoder()`和`Base64.getDecoder()`获取默认...

    JS 实现BASE64_ENCODE和BASE64_DECODE(实例代码)

    Base64是一种基于64个可打印字符来表示二进制数据的表示方法...一些如uuencode的其他编码方法,和之后binhex的版本使用不同的64字符集来代表6个二进制数字,但是它们不叫Base64。 Base64常用于在通常处理文本数据的场合

    PHP安全的URL字符串base64编码和解码

    如果直接使用base64_encode和base64_decode方法的话,生成的字符串可能不适用URL地址。下面的方法可以解决该问题: URL安全的字符串编码: 复制代码 代码如下: function urlsafe_b64encode($string) {  $data = ...

    Hospital-Access-Control-System:base64_encode 和 base64_decode

    二进制到文本编码(base64_encode 和 base64_decode) 这是一个非常简单的项目,用于收集有关加密使用性能的更多信息。 如果数据库一直加密和解密。 我们可以在多大程度上妥协性能和其他问题。 目前,我没有使用...

    Base64_encode_decode-开源

    综上所述,"Base64_encode_decode"开源项目提供了对Base64编码和解码的功能,对于开发者来说,这是一个方便的工具,可以轻松处理Base64数据,尤其在开发网络应用或处理跨平台数据交换时。通过阅读和理解这个项目的源...

    php 的加密函数 md5,crypt,base64_encode 等使用介绍

    不同的加密函数有着不同的用途和特性,它们可以在注册、登录或者URL...需要注意的是,md5()和crypt()的加密结果是不可逆的,而base64_encode()和urlencode()则可以轻松解码,因此在不同的场景下要灵活选择加密方法。

    Base64_java_

    在Java中,Base64编码和解码可以通过多种方式实现,其中包括标准库中的`java.util.Base64`类,以及一些第三方库。在你提供的`Base64.java`文件中,很可能包含了一个自定义的Base64编码和解码的实现。 Base64的工作...

    PHP保存Base64图片base64_decode的问题整理

    如果直接使用base64_decode函数,有可能会出现文件格式损坏的情况,因为base64_decode无法识别并处理前缀部分。 为了解决这个问题,我们需要先通过正则表达式或者字符串分割的方式来移除这个前缀,只保留Base64编码...

    Base64jiami.rar_asp base64_asp 加密_base64_base64 asp

    ASP中的Base64编码通常涉及两个主要函数:`Base64Encode`和`Base64Decode`。这两个函数可以帮助我们将数据转换为Base64格式和从Base64格式还原。 1. **Base64Encode**: 这个函数将任意的二进制数据(例如,字符串的...

    Base64.zip_Base64_labview_base64 labview_labview_labview 加密_加密

    在LabVIEW中实现Base64加密,通常会使用到“Base64 Encode”函数。这个函数接受二进制数据作为输入,然后输出对应的Base64字符串。解密过程则相反,使用“Base64 Decode”函数,将Base64字符串转换回原始的二进制...

    Base64_javascript_base64_

    let decodedStr = Base64.decode(encodedStr); console.log(encodedStr); // 输出:5L2g5aWz44GL44KL console.log(decodedStr); // 输出:你好,世界! ``` 五、总结 在JavaScript中,Base64编码和解码是前端开发...

Global site tag (gtag.js) - Google Analytics