問題出在您向您顯示輸出的編碼中,或者您用於將數據輸入到base64的編碼中。這實際上是base64編碼被髮明來幫助解決的問題。
不是試圖複製和粘貼非ASCII字符,而是將輸出保存爲二進制文件,然後檢查它。然後,編碼二進制文件。你會看到相同的base64字符串。
c:\TEMP>type b.txt
EYl0htUzhivYzcIo+zrIyEFQUE1PQkk=
c:\TEMP>base64 -d b.txt > b.bin
c:\TEMP>od -t x1 b.bin
0000000 11 89 74 86 d5 33 86 2b d8 cd c2 28 fb 3a c8 c8
0000020 41 50 50 4d 4f 42 49
c:\TEMP>base64 -e b.bin
EYl0htUzhivYzcIo+zrIyEFQUE1PQkk=
od是一個工具(八進制轉儲),使用十六進制表示法輸出的二進制數據,並且示出了每一個字節。
編輯:
你問你的意見,dDMrKDpBUFBNT0JJ不同的字符串,爲什麼是解碼到同樣的事情?那麼,它不解碼相同的事情。它解碼爲這個字節串:74 33 2b 28 3a 41 50 50 4d 4f 42 49.你的原始字符串被解碼爲這個字節串:11 89 74 86 d5 33 86 2b d8 cd c2 28 fb 3a c8 c8 41 50 50 4d 4f 42 49.
注意不同之處:將原始字符串解碼爲23個字節,將第二個字符串解碼爲僅12個字節。原始字符串包括非ASCII字節,如11,d5,d8,cd,c2,fb,c8,c8。這些字節在每個系統上都不以相同的方式打印。你稱它們爲「隨機字節」,但它們不是。它們是數據的一部分,base64旨在確保它們可以被傳輸。
我想明白爲什麼這些字符串是不同的,你需要先了解字符數據的性質,base64是什麼,以及它爲什麼存在。請記住,電腦只適用於數字,但人們需要使用熟悉的概念,如字母和數字。所以ASCII被創建爲一個「編碼」標準,代表了一個小數字(我們稱這個小數字爲「字節」)作爲字母或數字,以便人類可以讀取它。如果我們排成一組字節,我們可以拼出一條消息。 41 50 50 4d 4f 42 49是代表單詞APPMOBI的字節。我們將這樣一組字節稱爲「字符串」。
來自A-Z的每個字母和0-9中的每個數字都有一個用ASCII表示的數字。但是有許多不在標準中的額外數字,並不是所有這些數字都代表可見或合理的字母或數字。我們說他們是不可打印的。您的更長的消息包含許多不可打印的字節(您稱它們是隨機的。)
當像電子郵件這樣的計算機程序處理字符串時,如果字節是可打印的ASCII字符,則很容易。電子郵件程序知道如何處理它們。但是如果你的字節代表一張圖片,這些字節的值可能不是ASCII,並且各種電子郵件程序不知道如何處理它們。創建Base64是爲了獲取各種字節,包括可打印和不可打印的字節,並將它們轉換爲僅表示可打印字母的字符串。因爲它們都是可打印的,所以像電子郵件或網絡服務器這樣的程序可以輕鬆處理它們,即使它不知道它們實際上包含圖片。
這是你的新的字符串的解碼:
c:\TEMP>type c.txt
dDMrKDpBUFBNT0JJ
c:\TEMP>base64 -d c.txt
t3+(:APPMOBI
c:\TEMP>base64 -d c.txt > c.bin
c:\TEMP>od -t x1 c.bin
0000000 74 33 2b 28 3a 41 50 50 4d 4f 42 49
0000014
c:\TEMP>type c.bin
t3+(:APPMOBI
c:\TEMP>
也許當他複製該令牌時,非打印字符被過濾掉了? – Zzz
我複製並粘貼了'◄ëtå╒3å+╪═┬(√:╚╚APPMOBI'這個解碼的標記,所有的字符都在ASCII表中 – J2D8T
@ J2D8T實際上,任何高於0x7F的字節都是無效的[ASCII](http://en.wikipedia.org/wiki/ASCII)。 – Gumbo