BASE64 编码是一种常用的字符编码,在很多地方都会用到。JDK 中提供了非常方便的 BASE64Encoder 和 BASE64Decoder,用它们可以非常方便的完成基于 BASE64 的编码和解码。下面是本人编的两个小的函数,分别用于 BASE64 的编码和解码:
// 将 s 进行 BASE64 编码
public static String getBASE64(String s) {
if (s == null) return null;
return (new sun.misc.BASE64Encoder()).encode( s.getBytes() );
}
// 将 BASE64 编码的字符串 s 进行解码
public static String getFromBASE64(String s) {
if (s == null) return null;
BASE64Decoder decoder = new BASE64Decoder();
try {
byte[] b = decoder.decodeBuffer(s);
return new String(b);
} catch (Exception e) {
return null;
}
}
//将 BASE64 编码的字符串 InputStream 进行解码
public static java.nio.ByteBuffer getFromBASE64byte(String s) {
if (s == null)
return null;
BASE64Decoder decoder = new BASE64Decoder();
try {
return decoder.decodeBufferToByteBuffer(s);//decoder.decodeBuffer(s);
} catch (Exception e) {
return null;
}
}
//将 BASE64 编码的文件进行解码
ByteBuffer value = Base64Utils.getFromBASE64byte(nl.item(i*2+1).getTextContent().trim()); FileOutputStream fos = new FileOutputStream(filename); FileChannel fc = fos.getChannel();
fc.write(value);
fos.flush();
fc.close();
import sun.misc.BASE64Encoder;
import sun.misc.BASE64Decoder;
Java中提供了计算报文摘要的另一个简单的方法,那就是使用java.security.MessageDigest类。下列代码片断显示了如何将MD5报文摘要算法(128位的摘要)应用到密码字符串:
MassageDigest md=
MessageDigest.getInstance("MD5");
md.update(originalPwd.getByetes());
byte[] digestedBytes=md.digest();
也使用报文摘要创建校验和、文本的唯一ID(也叫做数字指纹)。在签写ARJ文件会发生:校验和是根据ARJ文件的内容计算出来的,然后被加密,并且用base64的加密格式存放在manifest.mf文件中。base64是编码任意二进制数据的一种方法,得到的结果仅包含可打印字符(注意,base64编码数据占用的空间比转换前多三分之一)。由于报文摘要算法输出的结果是字节数组,可以使用base64编码将哈希字节转换成字符串,以便能将该字符串存放在数据库的varchar字段中。现在有许多base64编码器,但是最简单的方法是使用weblogic.jar库中的编码器:weblogic.apache.xerces.utils.Base64。该类的作用微乎其微,如下面的代码例子所示:
String digestedPwdString =
new String(Base64.encode(digestedPwdBytes));
import javax.mail.internet.*;
import java.security.*;
public String getEncodedHash(String clearText){
ByteArrayOutputStream baos = new ByteArrayOutputStream();
OutputStream out = MimeUtility.encode(baos,"base64");
MessageDigest md = MessageDigest.getInstance("SHA");
if(clearText == null) clearText = "";
byte [] in = clearText.getBytes();
byte [] digested = md.digest(in);
out.write(digested);
out.close();
return new String(baos.toByteArray(), "ISO-8859-1");
}
java中编码和解码的问题
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了java中编码和解码的问题相关的知识,希望对你有一定的参考价值。
import java.io.*;
public class InputReader
public static void main (String [] args) throws Exception
InputStreamReader isr=new InputStreamReader(System.in,"iso8859-1");
BufferedReader br=new BufferedReader(isr);
String strLine=br.readLine();
//String str=new String(strLine.getBytes("gb2312"),"iso8859-1");
for(int i=0;i<strLine.length();i++)
System.out.println(Integer.toHexString((int)strLine.charAt(i)));
isr.close();
System.out.println(strLine);
//System.out.println(new String(strLine.getBytes("iso8859-1"),"gb2312"));
这段程序中对于编码和解码的问题我很疑惑,在输入“中国”之后进入程序不是自动使用Unicode编码方式将“中国”编码成4e2d 56fd的形式么,然后用把它编码成iso8859-1么?本来程序输出是乱码,但是加上
System.out.println(new String(strLine.getBytes("iso8859-1"),"gb2312"));
之后就成功了,这个语句的意思不是先把strLine字符串用gb2312编码,然后用iso8859-1解码成新字符串付给str么,最后通过system.out.println默认的gb2312方式编码输出么,中间我感觉很乱,有清楚中间各种转换过程的,能给我详细的解释下么!就是字符串在这个中是怎么一步步转换然后成功输出的!
1楼说的是先将字符串以iso8859-1的方式转换成字符数组,然后在利用string的getbytes的方法在进行一次编码?最后用gb2312的方式将字符转换?最后用默认的gb2312编码将字符输出?感觉有点乱!
其实这里很好明白
首先将字符串转换成byte数组。。以iso8859-1的编码来转换。。
然后使用new String创建一个新字符串,前面带上byte[]数组 后面带上他的具体编码。。
一般转码都使用这样的方式。。JSP里经常出现乱码的
都是加上过滤器然后中间使用这个new String(strLine.getBytes("iso8859-1"),"gb2312")方式将编码转换。本回答被提问者采纳
在 Java 中如何进行 BASE64 编码和解码
以上是关于java中编码和解码的问题的主要内容,如果未能解决你的问题,请参考以下文章