3 回答

TA貢獻1884條經(jīng)驗 獲得超4個贊
您的第一個錯誤是認為ASCII編碼和Base64編碼可以互換。他們不是。它們用于不同的目的。
使用ASCII編碼文本時,您將從文本字符串開始并將其轉(zhuǎn)換為字節(jié)序列。
在Base64中對數(shù)據(jù)進行編碼時,您將從字節(jié)序列開始并將其轉(zhuǎn)換為文本字符串。
要了解為什么首先需要Base64,我們需要一些計算歷史。
計算機以二進制形式(0和1)進行通信,但是人們通常希望與更豐富的表單數(shù)據(jù)(例如文本或圖像)進行通信。為了在計算機之間傳輸此數(shù)據(jù),首先必須將其編碼為0和1,然后發(fā)送,然后再次解碼。以文本為例-有許多不同的方法可以執(zhí)行此編碼。如果我們都可以同意一個編碼,這會簡單得多,但不幸的是事實并非如此。
最初,創(chuàng)建了許多不同的編碼(例如Baudot碼),每個字符使用不同的位數(shù),直到最終ASCII成為每個字符7位的標準。但是,大多數(shù)計算機將二進制數(shù)據(jù)存儲在每個字節(jié)由8位組成的字節(jié)中,因此ASCII不適合傳輸此類數(shù)據(jù)。有些系統(tǒng)甚至?xí)脸罡呶弧4送?,跨系統(tǒng)的行尾編碼的差異意味著有時還會修改ASCII字符10和13。
為了解決這些問題,引入了Base64編碼。這樣,您就可以將ribribry字節(jié)編碼為已知可以安全發(fā)送而不損壞的字節(jié)(ASCII字母數(shù)字字符和幾個符號)。缺點是使用Base64編碼消息會增加其長度-每3個字節(jié)的數(shù)據(jù)就會編碼為4個ASCII字符。
發(fā)送文本可靠,你可以先編碼,使用您的選擇(例如UTF-8),然后的文本編碼字節(jié)后的Base64編碼生成的二進制數(shù)據(jù)轉(zhuǎn)換為文本字符串,它是安全發(fā)送編碼為ASCII。接收者將不得不逆轉(zhuǎn)此過程以恢復(fù)原始消息。當然,這要求接收者知道使用了哪種編碼,并且該信息通常需要單獨發(fā)送。
從歷史上看,它已用于對電子郵件中的二進制數(shù)據(jù)進行編碼,其中電子郵件服務(wù)器可能會修改行尾。一個更現(xiàn)代的示例是使用Base64編碼將圖像數(shù)據(jù)直接嵌入HTML源代碼中。在這里,有必要對數(shù)據(jù)進行編碼,以避免像“ <”和“>”這樣的字符被解釋為標簽。
這是一個工作示例:
我希望發(fā)送兩行短信
你好
世界!
如果以ASCII(或UTF-8)格式發(fā)送,則如下所示:
72 101 108 108 111 10 119 111 114 108 100 33
字節(jié)10在某些系統(tǒng)中已損壞,因此我們可以將這些字節(jié)以64為基數(shù)編碼為Base64字符串:
SGVsbG8sCndvcmxkIQ ==
使用ASCII編碼時,如下所示:
83 71 86 115 98 71 56 115 67 110 100 118 99 109 120 107 73 61 61
這里的所有字節(jié)都是已知的安全字節(jié),因此,幾乎沒有任何系統(tǒng)會破壞此消息的機會。我可以發(fā)送此消息而不是原始消息,然后讓接收者撤消該過程以恢復(fù)原始消息。

TA貢獻1757條經(jīng)驗 獲得超7個贊
用XML編碼二進制數(shù)據(jù)
假設(shè)您要在XML文檔中嵌入幾個圖像。圖像是二進制數(shù)據(jù),而XML文檔是文本。但是XML無法處理嵌入式二進制數(shù)據(jù)。你是怎么做到的?
一種選擇是將圖像編碼為base64,將二進制數(shù)據(jù)轉(zhuǎn)換為XML可以處理的文本。
代替:
<images>
<image name="Sally">{binary gibberish that breaks XML parsers}</image>
<image name="Bobby">{binary gibberish that breaks XML parsers}</image>
</images>
你做:
<images>
<image name="Sally" encoding="base64">j23894uaiAJSD3234kljasjkSD...</image>
<image name="Bobby" encoding="base64">Ja3k23JKasil3452AsdfjlksKsasKD...</image>
</images>
XML解析器將能夠正確解析XML文檔并提取圖像數(shù)據(jù)。
添加回答
舉報