Base64 adalah salah satu metode pengkodean yang paling umum di jaringan untuk mengirimkan kode byte 8bit. Anda dapat memeriksa RFC2045 ~ RFC2049, yang berisi spesifikasi MIME terperinci. Base64 membutuhkan konversi setiap tiga byte 8bit menjadi empat byte 6bit (3*8 = 4*6 = 24), dan kemudian menambahkan dua 0s tinggi ke 6bit untuk membentuk empat byte 8bit. Dengan kata lain, string yang dikonversi secara teoritis akan 1/3 lebih lama dari yang asli.
Fungsi PHP: base64_encode () dan base64_decode ()
Base64 Pengkodean, Prinsip Dekoding
Base64 encoding actually converts 3 8-bit bytes into 4 6-bit bytes, (3*8 = 4*6 = 24) These 4 six-bit bytes are actually still 8-bits, but the higher two bits are set to 0. When only 6 bits of a byte are valid, its value space is 0 to 2 minus 1 to the 6th power of 63, that is, the value space of each code of the converted Base64 encoding is (0 ~ 63).
Faktanya, ada banyak karakter yang tidak terlihat dalam kode ASCII antara 0 dan 63, jadi pemetaan lain harus dibuat, dan tabel pemetaan adalah
'A' ~ 'Z'? ASCII (0 ~ 25)
'A' ~ 'Z'? ASCII (26 ~ 51)
'0' ~ '9'? ASCII (52 ~ 61)
''? ASCII (62)
'/'? ASCII (63)
Ini akan mengubah 3 byte 8-bit menjadi 4 karakter yang terlihat.
Metode spesifik pemisahan byte adalah: (gambar (ditarik dengan buruk, pahami semangat :-))
AAAAAABB CCCDDDDD EEFFFFFF // ABCDEF sebenarnya 1 atau 0. Untuk melihat dengan jelas, gunakan ABCDEF sebagai gantinya
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Byte 1 byte 2 byte 3
||
//
00AAAAAA 00BBCCCCC 00DDDEE 00FFFFFFF
CATATAN: Tiga bit byte di atas adalah teks asli, empat byte berikut adalah pengkodean base64, dan dua bit pertama adalah 0.
Saat membelah dengan cara ini, jumlah byte dalam teks asli harus kelipatan 3. Ketika kondisi ini tidak dapat dipenuhi, gunakan semua nol byte
Komplemen, saat mengonversi, encoding base64 diganti dengan = tanda, itulah sebabnya beberapa pengkodean base64 diakhiri dengan satu atau dua tanda yang sama.
Alasan untuk bundel, tetapi ada paling banyak dua tanda yang sama, karena: jika f (asal) mewakili jumlah byte dalam teks asli, f (tetap) digunakan untuk
Sisa meja, kalau begitu
F (tetap) = f (asal) mod 3 ditetapkan.
Oleh karena itu, nilai yang mungkin dari f (tetap) adalah 0, 1, 2.
Jika n = [f (asal) f (tetap)] / 3
Ketika f (tetap) = 0, itu dikonversi menjadi encoding base64 byte 4*n.
Ketika f (tetap) = 1, karena byte literal dapat dibagi menjadi dua byte yang dikodekan base64, untuk
Biarkan base64 encode menjadi kelipatan 4, sehingga harus dilengkapi dengan 2 tanda yang sama.
Ketika f (tetap) = 2, karena dua byte teks asli dapat dibagi menjadi 3 byte yang dikodekan base64, juga, juga,
Tanda yang sama harus ditambahkan.
Base64 Akan ada 0 hingga 2 tanda yang sama di ujung string yang dikodekan. Tanda -tanda yang sama ini tidak diperlukan untuk decoding, sehingga dapat dihapus.
Ketika jaringan mendapatkan dan memposting daftar parameter terdaftar, '+' tidak dapat ditransmisikan secara normal, sehingga Anda dapat menggantinya dengan '|'
Dengan cara ini, string yang dikodekan oleh Base64 hanya memiliki '|' dan '/', sehingga string yang dikodekan base64 dapat ditransfer sebagai daftar parameter dengan nilai parameter
==================================================================================================================================================
Berikut ini adalah implementasi yang ditulis oleh orang asing:
paket com.meterware.httpunit;
/********************************************************************************************************
* $ ID: base64.java, v 1.4 2002/12/24 15:17:17 Russgold Exp $
*
* Hak Cipta (C) 2000-2002 oleh Russell Gold
*
* Izin dengan ini diberikan, gratis, kepada siapa pun yang mendapatkan salinan perangkat lunak ini dan terkait
* File Dokumentasi ("Perangkat Lunak"), untuk menangani perangkat lunak tanpa batasan, termasuk tanpa batasan
* Hak untuk menggunakan, menyalin, memodifikasi, menggabungkan, mempublikasikan, distribusi, sublisensi, dan/atau menjual salinan perangkat lunak, dan
* Untuk mengizinkan orang -orang yang dilengkapi dengan perangkat lunak untuk melakukannya, tunduk pada kondisi berikut:
*
* Pemberitahuan hak cipta di atas dan pemberitahuan izin ini harus dimasukkan dalam semua salinan atau bagian substansial
* dari perangkat lunak.
*
* Perangkat lunak disediakan "sebagaimana adanya", tanpa jaminan apa pun, tersurat maupun tersirat, termasuk tetapi tidak terbatas
* Garansi dapat diperjualbelikan, kebugaran untuk tujuan tertentu dan nonpringement. Dalam hal apa pun tidak akan
* Penulis atau pemegang hak cipta bertanggung jawab atas klaim, kerusakan atau kewajiban lainnya, baik dalam tindakan
* Kontrak, gugatan atau sebaliknya, timbul dari, di luar atau sehubungan dengan perangkat lunak atau penggunaan atau lainnya
* Berurusan dengan perangkat lunak.
*
**********************************************************************************************************************************************************************************************
/**
* Kelas utilitas untuk dikonversi ke dan dari pangkalan 64 encoding.
*
* @author <a href = "mailto: [email protected]"> russell gold </a>
**/
Basis kelas publik64 {string statis final encodingchar = "abcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyz0123456789+/"; /*** Mengembalikan basis 64 setara dengan string yang disediakan. * @param Sumber String ke Encode */ Public Static String Encode (Sumber String) {char [] SourceBytes = getPaddedBytes (Source); int numgroups = (sourceBytes.length + 2) / 3; char [] targetBytes = char baru [4]; char [] target = char baru [4 * numgroups]; untuk (int grup = 0; grup <numgroups; grup ++) {convert3to4 (SourceBytes, grup*3, targetBytes); untuk (int i = 0; i <targetBytes.length; i ++) {target [i+4*grup] = encodingchar.charat (targetBytes [i]); }} int numpadbytes = sourceBytes.length - source.length (); untuk (int i = target.length-numpadbytes; i <target.length; i ++) target [i] = '='; mengembalikan string baru (target); } private static char [] getPaddedBytes (sumber string) {char [] dikonversi = source.tochararray (); int wajib diperlukan = 3 * ((dikonversi.length+2) /3); char [] hasil = arang baru [wajib panjang]; System.ArrayCopy (dikonversi, 0, hasil, 0, dikonversi.length); hasil pengembalian; } private static void convert3to4 (char [] sumber, int sourceIndex, char [] target) {target [0] = (char) (sumber [SourceIndex] >> 2); Target [1] = (char) (((Sumber [SourceIndex] & 0x03) <<4) | (Sumber [SourceIndex+1]>>> 4)); Target [2] = (char) (((Sumber [SourceIndex+1] & 0x0f) <<2) | (Sumber [SourceIndex+2]>>> 6)); target [3] = (char) (sumber [SourceIndex+2] & 0x3f); } /*** Mengembalikan setara dengan string basis 64-encoded. * @param Sumber A base 64 String (yang harus memiliki kelipatan dari 4 karakter) */ public static string decode (sumber string) {if (source.length ()%4! = 0) Lempar runtimeException baru ("kode base64 yang valid memiliki kelipatan 4 karakter"); int numgroups = source.length () / 4; int numextrabytes = source.endswith ("==")? 2: (Source.endswith ("=")? 1: 0); byte [] targetBytes = byte baru [3*numgroups]; byte [] SourceBytes = byte baru [4]; untuk (int grup = 0; grup <numgroups; grup ++) {for (int i = 0; i <sourceBytes.length; i ++) {SourceBytes [i] = (byte) math.max (0, encodingchar.indexOf (Source.charat (4*group+i))); } convert4to3 (sourceBytes, targetBytes, grup*3); } return string baru (targetBytes, 0, targetbytes.length - numextrabytes); } private static void convert4to3 (byte [] source, byte [] target, int targetIndex) {target [targetIndex] = (byte) ((sumber [0] <<2) | (sumber [1]>>> 4)); target [targetIndex+1] = (byte) (((sumber [1] & 0x0f) <<4) | (Sumber [2]>>> 2)); target [targetIndex+2] = (byte) (((sumber [2] & 0x03) <<6) | (Sumber [3])); }}