關於base64.js的一些介紹

Base64是網絡上最常見的用於傳輸8Bit字節碼的編碼方式之一,Base64就是一種基於64個可打印字符來表示二進制數據的方法。可查看RFC2045~RFC2049,上面有MIME的詳細規範。

Base64編碼是從二進制到字符的過程,可用於在HTTP環境下傳遞較長的標識信息。例如,在Java Persistence系統Hibernate中,就採用了Base64來將一個較長的唯一標識符(一般爲128-bit的UUID)編碼爲一個字符串,用作HTTP表單和HTTP GET URL中的參數。在其他應用程序中,也常常需要把二進制數據編碼爲適合放在URL(包括隱藏表單域)中的形式。此時,採用Base64編碼具有不可讀性,需要解碼後才能閱讀。

例子:

轉碼過程例子:
3*8=4*6
內存1個字節佔8位
轉前: s 1 3
先轉成ascii:對應 115 49 51
2進制: 01110011 00110001 00110011
6個一組(4組) 011100110011000100110011
然後纔有後面的 011100 110011 000100 110011
然後計算機是8位8位的存數 6不夠,自動就補兩個高位0了
所有有了 高位補0
科學計算器輸入 00011100 00110011 00000100 00110011
得到 28 51 4 51
查對下照表 c z E z

  先以“迅雷下載”爲例: 很多下載類網站都提供“迅雷下載”的鏈接,其地址通常是加密的迅雷專用下載地址。
其實迅雷的“專用地址”也是用Base64"加密"的,其過程如下:
一、在地址的前後分別添加AA和ZZ
二、對新的字符串進行Base64編碼
另: Flashget的與迅雷類似,只不過在第一步時加的“料”不同罷了,Flashget在地址前後加的“料”是[FLASHGET]
而QQ旋風的乾脆不加料,直接就對地址進行Base64編碼了
應用:
Base64編碼可用於在HTTP環境下傳遞較長的標識信息。例如,在Java Persistence系統Hibernate中,就採用了Base64來將一個較長的唯一標識符(一般爲128-bit的UUID)編碼爲一個字符串,用作HTTP表單和HTTP GET URL中的參數。在其他應用程序中,也常常需要把二進制數據編碼爲適合放在URL(包括隱藏表單域)中的形式。此時,採用Base64編碼不僅比較簡短,同時也具有不可讀性,即所編碼的數據不會被人用肉眼所直接看到。
然而,標準的Base64並不適合直接放在URL裏傳輸,因爲URL編碼器會把標準Base64中的“/”和“+”字符變爲形如“%XX”的形式,而這些“%”號在存入數據庫時還需要再進行轉換,因爲ANSI SQL中已將“%”號用作通配符。
爲解決此問題,可採用一種用於URL的改進Base64編碼,它不僅在末尾去掉填充的'='號,並將標準Base64中的“+”和“/”分別改成了“-”和“_”,這樣就免去了在URL編解碼和數據庫存儲時所要作的轉換,避免了編碼信息長度在此過程中的增加,並統一了數據庫、表單等處對象標識符的格式。
另有一種用於正則表達式的改進Base64變種,它將“+”和“/”改成了“!”和“-”,因爲“+”,“*”以及前面在IRCu中用到的“[”和“]”在正則表達式中都可能具有特殊含義。
此外還有一些變種,它們將“+/”改爲“_-”或“._”(用作編程語言中的標識符名稱)或“.-”(用於XML中的Nmtoken)甚至“_:”(用於XML中的Name)。
其他應用
Mozilla Thunderbird和Evolution用Base64來保密電子郵件密碼
Base64 也會經常用作一個簡單的“加密”來保護某些數據,而真正的加密通常都比較繁瑣。
垃圾訊息傳播者用Base64來避過反垃圾郵件工具,因爲那些工具通常都不會翻譯Base64的訊息。
在LDIF檔案,Base64用作編碼字串。

JavaScript版

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
if (!Shotgun)
    var Shotgun = {};
if (!Shotgun.Js)
    Shotgun.Js = {};
Shotgun.Js.Base64 = {
    _table: [
        'A''B''C''D''E''F''G''H''I''J''K''L''M''N''O''P',
        'Q''R''S''T''U''V''W''X''Y''Z''a''b''c''d''e''f',
        'g''h''i''j''k''l''m''n''o''p''q''r''s''t''u''v',
        'w''x''y''z''0''1''2''3''4''5''6''7''8''9''+''/'
    ],
  
    encode: function (bin) {
        var codes = [];
        var un = 0;
        un = bin.length % 3;
        if (un == 1)
            bin.push(0, 0);
        else if (un == 2)
            bin.push(0);
        for (var i = 2; i < bin.length; i += 3) {
            var c = bin[i - 2] << 16;
            c |= bin[i - 1] << 8;
            c |= bin[i];
            codes.push(this._table[c >> 18 & 0x3f]);
            codes.push(this._table[c >> 12 & 0x3f]);
            codes.push(this._table[c >> 6 & 0x3f]);
            codes.push(this._table[c & 0x3f]);
        }
        if (un >= 1) {
            codes[codes.length - 1] = "=";
            bin.pop();
        }
        if (un == 1) {
            codes[codes.length - 2] = "=";
            bin.pop();
        }
        return codes.join("");
    },
    decode: function (base64Str) {
        var i = 0;
        var bin = [];
        var x = 0, code = 0, eq = 0;
        while (i < base64Str.length) {
            var c = base64Str.charAt(i++);
            var idx = this._table.indexOf(c);
            if (idx == -1) {
                switch (c) {
                    case '=': idx = 0; eq++; break;
                    case ' ':
                    case '\n':
                    case "\r":
                    case '\t':
                        continue;
                    default:
                        throw "message""\u0062\u0061\u0073\u0065\u0036\u0034\u002E\u0074\u0068\u0065\u002D\u0078\u002E\u0063\u006E\u0020\u0045\u0072\u0072\u006F\u0072\u003A\u65E0\u6548\u7F16\u7801\uFF1A" + c };
                }
            }
            if (eq > 0 && idx != 0)
                throw "message""\u0062\u0061\u0073\u0065\u0036\u0034\u002E\u0074\u0068\u0065\u002D\u0078\u002E\u0063\u006E\u0020\u0045\u0072\u0072\u006F\u0072\u003A\u7F16\u7801\u683C\u5F0F\u9519\u8BEF\uFF01" };
  
            code = code << 6 | idx;
            if (++x != 4)
                continue;
            bin.push(code >> 16);
            bin.push(code >> 8 & 0xff);
            bin.push(code & 0xff)
            code = x = 0;
        }
        if (code != 0)
            throw "message""\u0062\u0061\u0073\u0065\u0036\u0034\u002E\u0074\u0068\u0065\u002D\u0078\u002E\u0063\u006E\u0020\u0045\u0072\u0072\u006F\u0072\u003A\u7F16\u7801\u6570\u636E\u957F\u5EA6\u9519\u8BEF" };
        if (eq == 1)
            bin.pop();
        else if (eq == 2) {
            bin.pop();
            bin.pop();
        else if (eq > 2)
            throw "message""\u0062\u0061\u0073\u0065\u0036\u0034\u002E\u0074\u0068\u0065\u002D\u0078\u002E\u0063\u006E\u0020\u0045\u0072\u0072\u006F\u0072\u003A\u7F16\u7801\u683C\u5F0F\u9519\u8BEF\uFF01" };
  
        return bin;
    }
};

BASH版

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
base64Table=(A B C D E F G H I J K L M N O P Q R S T U V W X Y Z a b c d e f g h i j k l m n o p q r s t u v w x y z 0 1 2 3 4 5 6 7 8 9 + /);
 
function str2binary() {
    idx=0;
    for((i=0; i<${#str}; i++)); do
        dividend=$(printf "%d" "'${str:i:1}");
        for((j=0;j<8;j++)); do
            let idx=8*i+7-j;
            let bin[$idx]=$dividend%2;
            dividend=$dividend/2;
        done;
    done;
    let idx=${#str}*8;
    for((i=0; i<appendEqualCnt*2; i++)); do
        let bin[$idx]=0;
        let idx++;
    done;
}
function calcBase64() {
    for((i=0; i<${#bin[*]}/6; i++)); do
        sum=0;
        for((j=0; j<6; j++)); do
            let idx=i*6+j;
            let n=6-1-j;
            let sum=sum+${bin[$idx]}*2**n;
        done;
        echo -n ${base64Table[$sum]};
    done
}
 
declare -a bin
function base64Encode() {
    read -p "please enter ASCII string:" str;
    let appendZero=${#str}*8%6;
    let bits=${#str}*8;
    appendEqualCnt=0;
    if [[ $appendZero -ne 0 ]]; then
        let appendEqualCnt=(6-$appendZero)/2;
    fi
    str2binary;
    calcBase64;
    if [[ $appendEqualCnt -eq 2 ]]; then
        echo -n "==";
    elif [[ $appendEqualCnt -eq 1 ]]; then
        echo -n "=";
    fi
    echo;
     
}

Java版

1
2
3
4
5
6
7
import java.util.Base64;
對於標準的Base64:
加密爲字符串使用Base64.getEncoder().encodeToString();
加密爲字節數組使用Base64.getEncoder().encode();
解密使用Base64.getDecoder().decode();
對於URL安全或MIME的Base64,只需將上述getEncoder()getDecoder()更換爲getUrlEncoder()getUrlDecoder()
或getMimeEncoder()和getMimeDecoder()即可。

PHP版

[下列代碼僅在GBK中實現,UTF8代碼請把 if($button=="迅雷地址->普通地址") echo substr(base64_decode(str_ireplace("thunder://","",$txt1)),2,-2); 這句改爲if($button=="迅雷地址->普通地址") echo substr(mb_convert_encoding(base64_decode(str_ireplace("thunder://","",$txt1))),2,-2); 並把charset=gb2312改爲charset=utf-8]
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
<?php
$txt1=trim($_POST['text1']);
$txt2=trim($_POST['text2']);
$txt3=trim($_POST['text3']);
$button=$_POST['button'];
?>
<!DOCTYPEHTMLPUBLIC"-//W3C//DTDHTML4.0Transitional//EN">
<html>
<head>
<title>迅雷和FlashGet,QQ旋風地址地址轉換工具</title>
<metahttp-equiv="Content-Type"content="text/html;charset=gb2312">
<metacontent="迅雷,FlashGet,地址轉換,"name="keywords">
</head>
<body>
<formname="form1"method="post"action="">
<hrsize="1">
<h3>迅雷轉換</h3>
<P>轉換地址:
<inputname="text1"value="<?phpecho$txt1;?>"type="text"style="width:516px;"/></P>
<P>轉換後的:
<inputtype="text"value="<?php
if($button=="普通地址->迅雷地址")echo"thunder://".base64_encode("AA".$txt1."ZZ");
if($button=="迅雷地址->普通地址")echosubstr(base64_decode(str_ireplace("thunder://","",$txt1)),2,-2);
?>"style="width:516px;"/></P>
<P>
<inputtype="submit"name="button"value="普通地址->迅雷地址"/>
<inputtype="submit"name="button"value="迅雷地址->普通地址"/></P>
<h3>FlashGet轉換</h3>
<P>FlashGet地址:
<inputname="text2"value="<?phpecho$txt2;?>"type="text"style="width:516px;"/></P>
<P>轉換後地址:
<inputtype="text"value="<?php
if($button=="普通地址->FlashGet地址")echo"flashget://".base64_encode($txt2);
if($button=="FlashGet地址->普通地址")echostr_ireplace("[FLASHGET]","",base64_decode(str_ireplace("flashget://","",$txt2)));
?>"style="width:516px;"/></P>
<P>
<inputtype="submit"value="普通地址->FlashGet地址"name="button"/>
<inputtype="submit"value="FlashGet地址->普通地址"name="button"/></P>
<h3>QQ旋風轉換</h3>
<P>QQ旋風地址:
<inputname="text3"value="<?phpecho$txt3;?>"type="text"style="width:516px;"/></P>
<P>轉換後地址:
<inputtype="text"value="<?php
if($button=="普通地址->QQ旋風")echo"qqdl://".base64_encode($txt3);
if($button=="QQ旋風->普通地址")echobase64_decode(str_ireplace("qqdl://","",$txt3));
?>"style="width:516px;"/></P>
<P>
<inputtype="submit"value="普通地址->QQ旋風"name="button"/>
<inputtype="submit"value="QQ旋風->普通地址"name="button"/></P>
</form>
</body>
</html>

VB版

注:其中DigestStrToHexStr爲可在程序外部調用加密函數
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
Option Explicit
'B as e64Encoding/DecodingAlgorithm
'By:DavidMidkif f([email protected])
'
'Thisalgorithmsencodes and decodesdatain to B as e64
'for mat.Thisfor matisextremelymoreefficientthan
'Hexadecimalencoding.
Private m_bytIndex(0 To 63) As Byte
Private m_bytReverseIndex(0 To 255) As Byte
Private Const k_bytEqualSign As Byte = 61
Private Const k_bytmask1 As Byte = 3
Private Const k_bytmask2 As Byte = 15
Private Const k_bytmask3 As Byte = 63
Private Const k_bytmask4 As Byte = 192
Private Const k_bytmask5 As Byte = 240
Private Const k_bytmask6 As Byte = 252
Private Const k_bytShift2 As Byte = 4
Private Const k_bytShift4 As Byte = 16
Private Const k_bytShift6 As Byte = 64
Private Const k_lMaxBytesPerLine As Long = 152
Private Declare Sub CopyMemory Lib "kernel32" Alias "RtlMoveMemory" (ByVal Destination As LongByVal Source As LongByVal Length As Long)
Public Function Decode64(sInput As StringAs String
If sInput = "" Then Exit Function
Decode64 = StrConv(DecodeArray64(sInput), vbUnicode)
End Function
Private Function DecodeArray64(sInput As StringAs Byte()
Dim bytInput() As Byte
Dim bytWorkspace() As Byte
Dim bytResult() As Byte
Dim lInputCounter As Long
Dim lWorkspaceCounter As Long
bytInput = Replace(Replace(sInput, vbCrLf, ""), "=""")
ReDim bytWorkspace(LBound(bytInput) To (UBound(bytInput) * 2)) As Byte
lWorkspaceCounter = LBound(bytWorkspace)
For lInputCounter = LBound(bytInput) To UBound(bytInput)
    bytInput(lInputCounter) = m_bytReverseIndex(bytInput(lInputCounter))
Next lInputCounter
For lInputCounter = LBound(bytInput) To (UBound(bytInput) - ((UBound(bytInput) Mod 8) + 8)) Step 8
    bytWorkspace(lWorkspaceCounter) = (bytInput(lInputCounter) * k_bytShift2) + (bytInput(lInputCounter + 2) \ k_bytShift4)
    bytWorkspace(lWorkspaceCounter + 1) = ((bytInput(lInputCounter + 2) And k_bytmask2) * k_bytShift4) + (bytInput(lInputCounter + 4) \ k_bytShift2)
    bytWorkspace(lWorkspaceCounter + 2) = ((bytInput(lInputCounter + 4) And k_bytmask1) * k_bytShift6) + bytInput(lInputCounter + 6)
    lWorkspaceCounter = lWorkspaceCounter + 3
Next lInputCounter
Select Case (UBound(bytInput) Mod 8):
    Case 3:
        bytWorkspace(lWorkspaceCounter) = (bytInput(lInputCounter) * k_bytShift2) + (bytInput(lInputCounter + 2) \ k_bytShift4)
    Case 5:
        bytWorkspace(lWorkspaceCounter) = (bytInput(lInputCounter) * k_bytShift2) + (bytInput(lInputCounter + 2) \ k_bytShift4)
        bytWorkspace(lWorkspaceCounter + 1) = ((bytInput(lInputCounter + 2) And k_bytmask2) * k_bytShift4) + (bytInput(lInputCounter + 4) \ k_bytShift2)
        lWorkspaceCounter = lWorkspaceCounter + 1
    Case 7:
        bytWorkspace(lWorkspaceCounter) = (bytInput(lInputCounter) * k_bytShift2) + (bytInput(lInputCounter + 2) \ k_bytShift4)
        bytWorkspace(lWorkspaceCounter + 1) = ((bytInput(lInputCounter + 2) And k_bytmask2) * k_bytShift4) + (bytInput(lInputCounter + 4) \ k_bytShift2)
        bytWorkspace(lWorkspaceCounter + 2) = ((bytInput(lInputCounter + 4) And k_bytmask1) * k_bytShift6) + bytInput(lInputCounter + 6)
        lWorkspaceCounter = lWorkspaceCounter + 2
End Select
ReDim bytResult(LBound(bytWorkspace) To lWorkspaceCounter) As Byte
If LBound(bytWorkspace) = 0 Then lWorkspaceCounter = lWorkspaceCounter + 1
    CopyMemoryVarPtr (bytResult(LBound(bytResult))), VarPtr(bytWorkspace(LBound(bytWorkspace))), lWorkspaceCounter
    DecodeArray64 = bytResult
End Function
Public Function Encode64(ByRefsInput As StringAs String
If sInput = "" Then Exit Function
Dim bytTemp() As Byte
bytTemp = StrConv(sInput, vbFromUnicode)
Encode64 = EncodeArray64(bytTemp)
End Function
Private Function EncodeArray64(ByRefbytInput() As ByteAs String
On Error GoTo ErrorHandler
Dim bytWorkspace() As Byte, bytResult() As Byte
Dim bytCrLf(0 To 3) As Byte, lCounter As Long
Dim lWorkspaceCounter As Long, lLineCounter As Long
Dim lCompleteLines As Long, lBytesRemaining As Long
Dim lpWorkSpace As Long, lpResult As Long
Dim lpCrLf As Long
If UBound(bytInput) < 1024 Then
    ReDim bytWorkspace(LBound(bytInput) To (LBound(bytInput) + 4096)) As Byte
Else
    ReDim bytWorkspace(LBound(bytInput) To (UBound(bytInput) * 4)) As Byte
End If
lWorkspaceCounter = LBound(bytWorkspace)
For lCounter = LBound(bytInput) To (UBound(bytInput) - ((UBound(bytInput) Mod 3) + 3)) Step 3
    bytWorkspace(lWorkspaceCounter) = m_bytIndex((bytInput(lCounter) \ k_bytShift2))
    bytWorkspace(lWorkspaceCounter + 2) = m_bytIndex(((bytInput(lCounter) And k_bytmask1) * k_bytShift4) + ((bytInput(lCounter + 1)) \ k_bytShift4))
    bytWorkspace(lWorkspaceCounter + 4) = m_bytIndex(((bytInput(lCounter + 1) And k_bytmask2) * k_bytShift2) + (bytInput(lCounter + 2) \ k_bytShift6))
    bytWorkspace(lWorkspaceCounter + 6) = m_bytIndex(bytInput(lCounter + 2) And k_bytmask3)
    lWorkspaceCounter = lWorkspaceCounter + 8
Next lCounter
Select Case (UBound(bytInput) Mod 3):
    Case 0:
        bytWorkspace(lWorkspaceCounter) = m_bytIndex((bytInput(lCounter) \ k_bytShift2))
        bytWorkspace(lWorkspaceCounter + 2) = m_bytIndex((bytInput(lCounter) And k_bytmask1) * k_bytShift4)
        bytWorkspace(lWorkspaceCounter + 4) = k_bytEqualSign
        bytWorkspace(lWorkspaceCounter + 6) = k_bytEqualSign
    Case 1:
        bytWorkspace(lWorkspaceCounter) = m_bytIndex((bytInput(lCounter) \ k_bytShift2))
        bytWorkspace(lWorkspaceCounter + 2) = m_bytIndex(((bytInput(lCounter) And k_bytmask1) * k_bytShift4) + ((bytInput(lCounter + 1)) \ k_bytShift4))
        bytWorkspace(lWorkspaceCounter + 4) = m_bytIndex((bytInput(lCounter + 1) And k_bytmask2) * k_bytShift2)
        bytWorkspace(lWorkspaceCounter + 6) = k_bytEqualSign
    Case 2:
        bytWorkspace(lWorkspaceCounter) = m_bytIndex((bytInput(lCounter) \ k_bytShift2))
        bytWorkspace(lWorkspaceCounter + 2) = m_bytIndex(((bytInput(lCounter) And k_bytmask1) * k_bytShift4) + ((bytInput(lCounter + 1)) \ k_bytShift4))
        bytWorkspace(lWorkspaceCounter + 4) = m_bytIndex(((bytInput(lCounter + 1) And k_bytmask2) * k_bytShift2) + ((bytInput(lCounter + 2)) \ k_bytShift6))
        bytWorkspace(lWorkspaceCounter + 6) = m_bytIndex(bytInput(lCounter + 2) And k_bytmask3)
End Select
lWorkspaceCounter = lWorkspaceCounter + 8
If lWorkspaceCounter <= k_lMaxBytesPerLine Then
    EncodeArray64 = Left$(bytWorkspace, InStr(1, bytWorkspace, Chr$(0)) - 1)
Else
    bytCrLf(0) = 13
    bytCrLf(1) = 0
    bytCrLf(2) = 10
    bytCrLf(3) = 0
ReDim bytResult(LBound(bytWorkspace) To UBound(bytWorkspace))
lpWorkSpace = VarPtr(bytWorkspace(LBound(bytWorkspace)))
lpResult = VarPtr(bytResult(LBound(bytResult)))
lpCrLf = VarPtr(bytCrLf(LBound(bytCrLf)))
lCompleteLines = Fix(lWorkspaceCounter / k_lMaxBytesPerLine)
For lLineCounter = 0 To lCompleteLines
    CopyMemorylpResult , lpWorkSpace, k_lMaxBytesPerLine
    lpWorkSpace = lpWorkSpace + k_lMaxBytesPerLine
    lpResult = lpResult + k_lMaxBytesPerLine
    CopyMemorylpResult , lpCrLf, 4&
    lpResult = lpResult + 4&
Next lLineCounter
lBytesRemaining = lWorkspaceCounter - (lCompleteLines * k_lMaxBytesPerLine)
If lBytesRemaining > 0 Then CopyMemorylpResult , lpWorkSpace, lBytesRemaining
    EncodeArray64 = Left$(bytResult, InStr(1, bytResult, Chr$(0)) - 1)
End If
Exit Function
ErrorHandler:
    Er As ebytResult
    EncodeArray64 = bytResult
End Function

C#版

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
直接使用.NET中的的庫類函數
方法:
///<summary>
///Base64加密
///</summary>
///<paramname="Message"></param>
///<returns></returns>
publicstringBase64Code(stringMessage)
{
byte[]bytes=Encoding.Default.GetBytes(Message);
returnConvert.ToBase64String(bytes);
}
///<summary>
///Base64解密
///</summary>
///<paramname="Message"></param>
///<returns></returns>
publicstringBase64Decode(stringMessage)
{
byte[]bytes=Convert.FromBase64String(Message);
returnEncoding.Default.GetString(bytes);
}
在MIME格式的電子郵件中,base64可以用來將binary的字節序列數據編碼成ASCII字符序列構成的文本。使用時,在傳輸編碼方式中指定base64。使用的字符包括大小寫字母各26個,加上10個數字,和加號“+”,斜槓“/”,一共64個字符,等號“=”用來作爲後綴用途。
完整的base64定義可見 RFC1421和 RFC2045。編碼後的數據比原始數據略長,爲原來的4/3。在電子郵件中,根據RFC822規定,每76個字符,還需要加上一個回車換行。可以估算編碼後數據長度大約爲原長的135.1%。
轉換的時候,將三個byte的數據,先後放入一個24bit的緩衝區中,先來的byte佔高位。數據不足3byte的話,於緩衝區中剩下的Bit用0補足。然後,每次取出6個bit,按照其值選擇ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/中的字符作爲編碼後的輸出。不斷進行,直到全部輸入數據轉換完成。
如果最後剩下兩個輸入數據,在編碼結果後加1個“=”;如果最後剩下一個輸入數據,編碼結果後加2個“=”;如果沒有剩下任何數據,就什麼都不要加,這樣纔可以保證資料還原的正確性。
舉例來說,一段引用自Thomas Hobbes's Leviathan的文句:
Man is distinguished, not only by his reason, but by this singular passion from other animals, which is a lust of the mind, that by a perseverance of delight in the continued and indefatigable generation of knowledge, exceeds the short vehemence of any carnal pleasure.
經過base64編碼之後變成:
TWFuIGlzIGRpc3Rpbmd1aXNoZWQsIG5vdCBvbmx5IGJ5IGhpcyByZWFzb24sIGJ1dCBieSB0aGlz
IHNpbmd1bGFyIHBhc3Npb24gZnJvbSBvdGhlciBhbmltYWxzLCB3aGljaCBpcyBhIGx1c3Qgb2Yg
dGhlIG1pbmQsIHRoYXQgYnkgYSBwZXJzZXZlcmFuY2Ugb2YgZGVsaWdodCBpbiB0aGUgY29udGlu
dWVkIGFuZCBpbmRlZmF0aWdhYmxlIGdlbmVyYXRpb24gb2Yga25vd2xlZGdlLCBleGNlZWRzIHRo
ZSBzaG9ydCB2ZWhlbWVuY2Ugb2YgYW55IGNhcm5hbCBwbGVhc3VyZS4=

引用百度的原文地址:https://baike.baidu.com/item/base64/8545775?fr=aladdin



發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章