zoukankan      html  css  js  c++  java
  • Base64编码简介及在java中的使用

     Base64编码简介及在java中的使用 
     

      Base64是大家经常使用的编码方式,最早是为了发送邮件附件而产生的,今天解决了一个Base64解码的错误,就趁机稍微总结一下吧。

    原理

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

    例如:字符串"123","1"对应的ASCII码为49,"2"对应的ASCII码为50,"3"对应的ASCII码为51,如下:

    00110001 00110010 00110011

    将以上24个字节分成4组,每组6个字节,如:

    00110001 00110010 00110011

    然后每组之前补两个0,如下:

    000011000001 0011000010 0000110011

    用十进制表示即为:

    12,19,8,51

    我们再根据如下Base64编码表,查出对应的编码:

    Table 1: The Base 64 Alphabet
    
          Value Encoding  Value Encoding  Value Encoding  Value Encoding
              0 A            17 R            34 i            51 z
              1 B            18 S            35 j            52 0
              2 C            19 T            36 k            53 1
              3 D            20 U            37 l            54 2
              4 E            21 V            38 m            55 3
              5 F            22 W            39 n            56 4
              6 G            23 X            40 o            57 5
              7 H            24 Y            41 p            58 6
              8 I            25 Z            42 q            59 7
              9 J            26 a            43 r            60 8
             10 K            27 b            44 s            61 9
             11 L            28 c            45 t            62 +
             12 M            29 d            46 u            63 /
             13 N            30 e            47 v
             14 O            31 f            48 w         (pad) =
             15 P            32 g            49 x
             16 Q            33 h            50 y

     

    因此Base64之后就是MTIz。

    如果原始字符不是3的整数倍,则将结果不够6位的用0来补上相应的位置,之后再在6位的前面补两个0,例如要对字符串"1"进行编码,如下:

    00110001

    6位一组,不够部分全部补零,如下:

    001100010000

    然后每组之前补两个0,如下:

    0000110000010000

    用十进制表示即为:

    12,16

    分别对应M,Q,剩余两位为空,用=替代,编码结果为:

    MQ==

    因此很多情况下,Base64编码之后,可能会用==结尾。

    注意:根据RFC822规定,每76个字符,还需要加上一个回车换行。

    Base64解码的原理刚好相反,再次不再赘述。

    在JAVA中的实现

    java已经有封装好的Base64实现,很简单,直接看代码吧。

    1. 编码

    1.     /**
    2.      * Description: 编码
    3.      * @Version1.0 Jan 2, 2009 11:48:48 PM by 崔红保 创建
    4.      * @param pBytes
    5.      * @return
    6.      */
    7.     public static String base64Encode(byte[] pBytes) {
    8.         BASE64Encoder base64 = new BASE64Encoder();
    9.         return base64.encode(pBytes);
    10.     }
    11.     /**
    12.      * Description: 编码
    13.      * @Version1.0 Jan 2, 2009 11:49:02 PM by 崔红保 创建
    14.      * @param str
    15.      * @return
    16.      */
    17.     public static String base64Encode(String str) {
    18.         try {
    19.             return base64Encode(str.getBytes("utf-8"));
    20.         } catch (UnsupportedEncodingException e) {
    21.             e.printStackTrace();
    22.         }
    23.         return null;
    24.     }

    2.解码

    1.     /**
    2.      * Description: 解码
    3.      * @Version1.0 Jan 2, 2009 11:49:08 PM by 崔红保 创建
    4.      * @param pContent
    5.      * @return
    6.      * @throws IOException
    7.      */
    8.     public static byte[] base64Decode(String pContent) throws IOException {
    9.         BASE64Decoder base64 = new BASE64Decoder();
    10.         return base64.decodeBuffer(pContent);    
    11.     }

    参考资料

    http://www.faqs.org/rfcs/rfc3548.html

    http://blog.csdn.net/zzyy00/archive/2006/09/06/1186959.aspx

  • 相关阅读:
    Memcached: 目录
    Memcached: temple
    Redis: Redis支持五种数据类型
    互联网市场
    java实现猜生日
    java实现汉诺塔计数
    java实现汉诺塔计数
    java实现汉诺塔计数
    java实现汉诺塔计数
    java实现汉诺塔计数
  • 原文地址:https://www.cnblogs.com/hehe520/p/6330218.html
Copyright © 2011-2022 走看看