`
wangdei
  • 浏览: 372999 次
社区版块
存档分类
最新评论

Base64基础(2)

阅读更多

url: http://zh.wikipedia.org/wiki/Base64

Base64是一種使用64基的位置計數法。它使用2的最大次方來代表僅可列印的ASCII 字元。這使它可用來作為電子郵件的傳輸編碼。在Base64中的變數使用字元A-Z、a-z和0-9 ,這樣共有62個字元,用來作為開始的64個數字,最後兩個用來作為數字的符號在不同的系統中而不同。一些如uuencode的其他編碼方法,和之後binhex的版本使用不同的64字符集來代表6個二進位數字,但是它們不叫Base64。

MIME

MIME格式的電子郵件中,base64可以用來將binary的位元組序列數據編碼成ASCII字元序列構成的文本。使用時,在傳輸編碼方式中指定base64。使用的字元包括大小寫字母各26個,加上10個數字,和加號「+」,斜杠「/」,一共64個字元,等號「=」用來作為後綴用途。

完整的base64定義可見 RFC1421RFC2045。編碼後的數據比原始數據略長,為原來的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=
一個例子
  • 編碼「Man」
「M」的ASCII碼 =  77 = 01001101
「a」的 =  97 = 01100001
「n」的 = 110 = 01101110 

將這三個位元組拼合,得出一個24位的資料:

010011010110000101101110

現在六個一組的分開,這樣便得到六個數。將這些數轉為:

010011 = 19 = T (T是第19個英文字母)
010110 = 22 = W (W是第22個英文字母)
000101 =  5 = F
101110 = 46 = u (U是第20個英文字母)

base64編碼是:
00010011 00010110 00000101 00101110

即是每3個未編碼位元組,編碼後會得到4個位元組。

  • 加密M:M=01001101,變成加密010011010000,六個一組分開是010011 010000,結果是TQ,然後在後面加兩個「=」,結果就是「TQ==」。

在URL中的應用

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)。

分享到:
评论

相关推荐

    Base64引入包

    Base64是一种在网络上传输和...总的来说,Base64编码在Java中是一个基础而重要的工具,广泛应用于网络通信、数据存储和文件传输等领域。了解并掌握如何在不同版本的Java中使用Base64,对于进行数据处理和传输至关重要。

    BASE64图片解码_解码_vba图片base64_base64_VBa_图片_

    在Excel中使用VBA(Visual Basic for Applications)解码BASE64编码的图片是...在实际项目中,你可能需要根据具体需求调整和扩展这些基础代码,例如处理多个图片、自动查找和替换BASE64字符串,或者与用户界面交互等。

    VB JPG转base64和base64转JPG.rar

    通过学习和理解这些代码,开发者不仅可以掌握Base64编码的基础知识,还能了解到VB6.0处理文件和字符串的方法,这对于进行类似的数据传输和存储工作大有裨益。 总之,Base64编码是IT行业中一个重要的概念,尤其在...

    Delphi版的Base64互相转换函数

    Base64是一种网络上常见的数据编码方式,它将任意二进制数据转化为可打印的ASCII字符,以便在电子邮件、文本协议...了解这些基础知识,开发者就能在Delphi项目中有效地处理Base64编码和解码任务,满足不同场景的需求。

    BASE64Encoder.jar

    3. **证书和密钥**:在PKI(Public Key Infrastructure,公钥基础设施)中,Base64用于编码X.509证书和RSA密钥,使其能在文本格式下显示和交换。 4. **XML和JSON**:在这些数据交换格式中,Base64编码可以将二进制...

    base64包,decodeBase64包,encodeBase64String包

    2. **Base64解码**: `decodeBase64()`方法则是用于将Base64字符串解码回原始的字节数组。当你从HTTP响应或者JSON数据中接收到一个Base64编码的字符串时,你可以用此方法恢复其原始的二进制格式。这对于接收和处理像...

    BASE64编码转换工具

    总的来说,理解并熟练运用BASE64编码和十六进制转换对于从事IT工作的人来说至关重要,无论是数据的传输、存储还是加密解密,这些基础知识都发挥着基础性的作用。"编码转换工具"则提供了一个便捷的平台,帮助用户在...

    Base64系列第四篇 C/C++中使用Base64编码解码(从chromium库中抽取)

    2. `base64_decode`: 这个函数接收Base64编码的字符串,验证其合法性后,解码回原始的二进制数据。解码过程中会检查字符是否在Base64字符集中,以及是否正确地用`=`填充。 3. `IsBase64`: 可能存在一个辅助函数,...

    C# 文件转换base64

    在C#编程中,将文件转换为Base64编码是一种常见的操作,特别是在处理二进制数据,如图像、文档或任何其他非文本数据时。Base64是一种用于将二进制数据表示为ASCII字符串的编码方式,使得这些数据可以在电子邮件等不...

    BASE64的jar包

    总结一下,"BASE64的jar包"是一个小巧实用的Java库,专注于Base64编码和解码功能,对于那些只需要基础功能且希望减小项目体积的开发者来说,是个不错的选择。它简化了开发流程,使得在处理Base64相关的任务时更加...

    Base64加密解密.zip

    在C#编程环境中,Base64的加密和解密操作是非常基础且实用的功能,特别是在处理如图片、证书等二进制文件时。以下是对Base64加密解密的详细讲解以及如何在C# WinForm应用中实现。 首先,理解Base64的基本原理。Base...

    微信小程序base64加解密

    但无论使用哪种加密方式,基础的Base64编码都是数据传输和存储过程中不可或缺的一环。 总结来说,微信小程序中的Base64加解密主要依赖于微信小程序提供的API,如`wx.base64ToArrayBuffer()`和`wx.arrayBufferToBase...

    Base64_javascript_base64_

    在JavaScript中,Base64编码和解码是前端开发中的基础技能。虽然原生API提供了基本功能,但在处理特定场景如URL安全或非ASCII字符时,使用第三方库如`Base64.js`会更灵活和强大。了解这些知识能帮助开发者更好地应对...

    实现base64编码工具类及整套jar.zip_Base64.jar_base64 jar_jar base64_工具类及整套j

    2. **解码**:将Base64字符串还原为原始字节数组。这个过程需要解析Base64字符,去除填充符,并组合成原始字节序列。 3. **加解密**:在某些情况下,可能需要在Base64编码前进行加密,或在解码后进行解密。这可以...

    C语言base64编码解码库

    C语言是编程语言的基础,被广泛应用于系统编程和嵌入式开发,因此一个C语言实现的Base64编码解码库对于开发者来说非常有用。下面将详细介绍这个名为"C语言base64编码解码库"的资源。 该库是从GitHub上获取的,这...

    易语言Base64支持密码加密

    结合题目中的描述,易语言Base64支持密码加密源码实现了在Base64编码的基础上,增加了一层密码保护。这意味着在编码前,数据会先经过密码加密,然后再进行Base64转换。这样,即使数据被截获,没有正确的解密密码,也...

    文件转化为base64字符串

    在IT行业中,Base64是一种常见的数据编码方法,它将任意二进制数据转换为可打印的ASCII字符串。...在描述中提到的“文件转化为base64字符串”,是指将...理解并掌握Base64编码对于IT专业人士来说是非常基础且重要的技能。

    base64 三个jar包

    虽然它可能没有ext版本包含那么多的扩展功能,但仍然包含了基础的加密和编码功能,包括Base64操作。如果你的项目只需要Base64处理,且不涉及其他高级加密算法,这个jar包可能已经足够了。 3. **commons-codec-1.10....

    android BASE64的jar包

    在Android开发中,有时我们需要对数据进行编码和解码,其中BASE64是一种常见的编码方式。这个"android BASE64的jar包"提供了一个用于处理BASE64编码和解码功能的库,对于那些在Android应用中需要进行二进制到ASCII...

    HexString和Base64String的相互转换

    2. **Base64String转HexString**:这个过程首先对Base64字符串进行解码,还原成原始的二进制数据,然后再将这些二进制数据每字节拆分成两个十六进制字符,从而得到HexString。 在提供的`DataConvert.sln`和`...

Global site tag (gtag.js) - Google Analytics