在 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格式有进一步的分析,请续之。
多谢。