小男孩‘自慰网亚洲一区二区,亚洲一级在线播放毛片,亚洲中文字幕av每天更新,黄aⅴ永久免费无码,91成人午夜在线精品,色网站免费在线观看,亚洲欧洲wwwww在线观看

分享

在 Java 中如何進(jìn)行BASE64 編碼和解碼

 zybingliu 2007-10-10
在 Java 中如何進(jìn)行 BASE64 編碼和解碼(轉(zhuǎn))
 
BASE64 編碼是一種常用的字符編碼,在很多地方都會(huì)用到。JDK 中提供了非常方便的 BASE64Encoder 和 BASE64Decoder,用它們可以非常方便的完成基于 BASE64 的編碼和解碼。下面是本人編的兩個(gè)小的函數(shù),分別用于 BASE64 的編碼和解碼:

import sun.misc.BASE64Encoder;
import sun.misc.BASE64Decoder;



// 將 s 進(jìn)行 BASE64 編碼

public static String getBASE64(String s) { 
   if (s == null) return null
   return (new sun.misc.BASE64Encoder()).encode( s.getBytes() );
}

// 將 BASE64 編碼的字符串 s 進(jìn)行解碼
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
   }
}



使用報(bào)文摘要

Java中提供了計(jì)算報(bào)文摘要的另一個(gè)簡(jiǎn)單的方法,那就是使用java.security.MessageDigest類(lèi)。下列代碼片斷顯示了如何將MD5報(bào)文摘要算法(128位的摘要)應(yīng)用到密碼字符串:
MassageDigest md=
MessageDigest.getInstance("MD5");
md.update(originalPwd.getByetes());
byte[] digestedBytes=md.digest();

也使用報(bào)文摘要?jiǎng)?chuàng)建校驗(yàn)和、文本的唯一ID(也叫做數(shù)字指紋)。在簽寫(xiě)ARJ文件會(huì)發(fā)生:校驗(yàn)和是根據(jù)ARJ文件的內(nèi)容計(jì)算出來(lái)的,然后被加密,并且用base64的加密格式存放在manifest.mf文件中。base64是編碼任意二進(jìn)制數(shù)據(jù)的一種方法,得到的結(jié)果僅包含可打印字符(注意,base64編碼數(shù)據(jù)占用的空間比轉(zhuǎn)換前多三分之一)。由于報(bào)文摘要算法輸出的結(jié)果是字節(jié)數(shù)組,可以使用base64編碼將哈希字節(jié)轉(zhuǎn)換成字符串,以便能將該字符串存放在數(shù)據(jù)庫(kù)的varchar字段中?,F(xiàn)在有許多base64編碼器,但是最簡(jiǎn)單的方法是使用weblogic.jar庫(kù)中的編碼器:weblogic.apache.xerces.utils.Base64。該類(lèi)的作用微乎其微,如下面的代碼例子所示:

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");
}



JDK1.4中的sun.misc.BASE64Encoder1在編碼的字節(jié)較長(zhǎng)時(shí),encode出來(lái)的字符竄會(huì)在中間插入\n\r, 用Weblogic帶的BASE64Encoder沒(méi)有加回車(chē)換行

完整的base64定義可見(jiàn)RFC-1421和RFC-2045。編碼后的數(shù)據(jù)比原始數(shù)據(jù)略長(zhǎng),為原來(lái)的4/3。在電子郵件中,根據(jù)RFC822規(guī)定,每76個(gè)字符,還需要加上一個(gè)回車(chē)換行



一個(gè)BASE64的實(shí)現(xiàn):

 1 /**
 2  * @author yovn
 3  * 
 4  */
 5 public class BASE64Encoder {
 6 
 7     private static char[] codec_table = { 'A''B''C''D''E''F''G',
 8             'H''I''J''K''L''M''N''O''P''Q''R''S''T',
 9             'U''V''W''X''Y''Z''a''b''c''d''e''f''g',
10             'h''i''j''k''l''m''n''o''p''q''r''s''t',
11             'u''v''w''x''y''z''0''1''2''3''4''5''6',
12             '7''8''9''+''/' };
13 
14     public BASE64Encoder() {
15 
16     }
17 
18     public String encode(byte[] a) {
19         int totalBits = a.length * 8;
20         int nn = totalBits % 6;
21         int curPos = 0;// process bits
22         StringBuffer toReturn = new StringBuffer();
23         while (curPos < totalBits) {
24             int bytePos = curPos / 8;
25             switch (curPos % 8) {
26             case 0:
27                 toReturn.append(codec_table[(a[bytePos] & 0xfc>> 2]);
28                 break;
29             case 2:
30 
31                 toReturn.append(codec_table[(a[bytePos] & 0x3f)]);
32                 break;
33             case 4:
34                 if (bytePos == a.length - 1) {
35                     toReturn
36                             .append(codec_table[((a[bytePos] & 0x0f<< 2& 0x3f]);
37                 } else {
38                     int pos = (((a[bytePos] & 0x0f<< 2| ((a[bytePos + 1& 0xc0>> 6)) & 0x3f;
39                     toReturn.append(codec_table[pos]);
40                 }
41                 break;
42             case 6:
43                 if (bytePos == a.length - 1) {
44                     toReturn
45                             .append(codec_table[((a[bytePos] & 0x03<< 4& 0x3f]);
46                 } else {
47                     int pos = (((a[bytePos] & 0x03<< 4| ((a[bytePos + 1& 0xf0>> 4)) & 0x3f;
48                     toReturn.append(codec_table[pos]);
49                 }
50                 break;
51             default:
52                 //never hanppen
53                 break;
54             }
55             curPos+=6;
56         }
57         if(nn==2)
58         {
59             toReturn.append("==");
60         }
61         else if(nn==4)
62         {
63             toReturn.append("=");
64         }
65         return toReturn.toString();
66 
67     }
68 
69 }

    本站是提供個(gè)人知識(shí)管理的網(wǎng)絡(luò)存儲(chǔ)空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點(diǎn)。請(qǐng)注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購(gòu)買(mǎi)等信息,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請(qǐng)點(diǎn)擊一鍵舉報(bào)。
    轉(zhuǎn)藏 分享 獻(xiàn)花(0

    0條評(píng)論

    發(fā)表

    請(qǐng)遵守用戶 評(píng)論公約

    類(lèi)似文章 更多