在 Java 中如何进行 BASE64,一个有趣的发现

在 Java 中如何进行 BASE64,一个有趣的发现
mht html htm base64 java


原程序出自james中,我只是加了一个main方法,并注释package.
文件名:Base64.java
用法:
    java Base64 enc 好人
        输出:usPIywAA
   java Base64 dec usPIywAA
        输出:好人
修改人:hajavaor


如果想了解Base64的相关编码与解码的知识,
强烈推荐:http://www.luocong.com/articles/show_article.asp?Article_ID=17   
文章标题:矛与盾的较量(4)——奇妙的Base64编码

看完后,就完全知道base64是怎么回事了。

更多精彩,请见文章最后,我的发现。


闲话不多说,见java源程序。

file://程序开始
/* ====================================================================
 * The Apache Software License, Version 1.1
 *
 * Copyright (c) 2000-2003 The Apache Software Foundation.  All rights
 * reserved.
 *
 * Redistribution and use in source and binary forms, with or without
 * modification, are permitted provided that the following conditions
 * are met:
 *
 * 1. Redistributions of source code must retain the above copyright
 *    notice, this list of conditions and the following disclaimer.
 *
 * 2. Redistributions in binary form must reproduce the above copyright
 *    notice, this list of conditions and the following disclaimer in
 *    the documentation and/or other materials provided with the
 *    distribution.
 *
 * 3. The end-user documentation included with the redistribution,
 *    if any, must include the following acknowledgment:
 *       "This product includes software developed by the
 *        Apache Software Foundation (http://www.apache.org/)."
 *    Alternately, this acknowledgment may appear in the software itself,
 *    if and wherever such third-party acknowledgments normally appear.
 *
 * 4. The names "Apache", "Jakarta", "JAMES" and "Apache Software Foundation"
 *    must not be used to endorse or promote products derived from this
 *    software without prior written permission. For written
 *    permission, please contact [email protected].
 *
 * 5. Products derived from this software may not be called "Apache",
 *    nor may "Apache" appear in their name, without prior written
 *    permission of the Apache Software Foundation.
 *
 * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED
 * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
 * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
 * DISCLAIMED.  IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR
 * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
 * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
 * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
 * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
 * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
 * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
 * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
 * SUCH DAMAGE.
 * ====================================================================
 *
 * This software consists of voluntary contributions made by many
 * individuals on behalf of the Apache Software Foundation.  For more
 * information on the Apache Software Foundation, please see
 * .
 *
 * Portions of this software are based upon public domain software
 * originally written at the National Center for Supercomputing Applications,
 * University of Illinois, Urbana-Champaign.
 */


file://package org.apache.james.util;

import javax.mail.internet.MimeUtility;
import java.io.BufferedReader;
import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.InputStreamReader;


/**
 * Simple Base64 string decoding function
 * @author Jason Borden
 *
 * @version This is $Revision: 1.5.4.2 $
 */

public class Base64 {

    public static BufferedReader decode(String b64string) throws Exception {
        return new BufferedReader(
                   new InputStreamReader(
                       MimeUtility.decode(
                            new ByteArrayInputStream(
                                b64string.getBytes()), "base64")));
    }
    file://2003-10-29 10:28 hajavaor added
    public static void main(String args[]) throws Exception{
        if (args.length!=2){
            System.err.println("Usage: java Base64 encORdec yourStrings");
            System.exit(0);
        }
       
        String str1 = args[0].trim();
        if (str1.equalsIgnoreCase("enc")){           
            System.out.println(encodeAsString(args[1]));   
        }
        else if(str1.equalsIgnoreCase("dec")){
            System.out.println(decodeAsString(args[1]));   
        }
        else{
            System.err.println("Usage: java Base64 encORdec yourStrings");
            System.exit(0);       
        }       
    }
    //

    public static String decodeAsString(String b64string) throws Exception {
        if (b64string == null) {
            return b64string;
        }
        String returnString = decode(b64string).readLine();
        if (returnString == null) {
            return returnString;
        }
        return returnString.trim();
    }

    public static ByteArrayOutputStream encode(String plaintext)
            throws Exception {
        ByteArrayOutputStream out = new ByteArrayOutputStream();
        byte[] in = plaintext.getBytes();
        ByteArrayOutputStream inStream = new ByteArrayOutputStream();
        inStream.write(in, 0, in.length);
        // pad
        if ((in.length % 3 ) == 1){
            inStream.write(0);
            inStream.write(0);
        } else if((in.length % 3 ) == 2){
            inStream.write(0);
        }
        inStream.writeTo( MimeUtility.encode(out, "base64")  );
        return out;
    }

    public static String encodeAsString(String plaintext) throws Exception {
        return  encode(plaintext).toString();
    }


}
///程序结束。

一个有趣的发现(关于微软mht文件的格式):
     我们用IE另存网页文件时,有多种选择。  
     1、WEB页全部。你会发现一个html文件及一个相应的文件夹。这样,我们在打开这个网页文件的时候,能同时看到网页的附加元素(图片、样式表、帧等)。windows系统将这个文件与文件夹建立了一种关联,当你移动html文件的时候,你发现文件夹也同时被移动了。当你删除这个文件夹的时候,会发现文件也被删除了。我们可以先将文件夹改名,然后就可以安全删除文件夹了。
     2、WEB文档,单一格式,即mht文件。这样我们就可以在一个文件中保存网页的全部内容。你可以用记事本打开这个文件,会发现:里面的正文以Base64编码,并且整个文件结构很象邮件的结构。是这样的吗?将mht改名为eml,然后双击,竟然真的能用Outlook express打开了。
     原来,mht文件就是一封邮件,内容以Base64编码。
     同理,你可以将邮件从outlook express拖到外面,生成一个*.eml文件。将文件改名试试。
       有意思。

     谁对mht格式有进一步的分析,请续之。

    多谢。

 

你可能感兴趣的:(java技术另类应用)