Rumah  >  Artikel  >  pembangunan bahagian belakang  >  Bagaimana untuk melaksanakan pengekodan dan penyahkodan Base64 dalam php

Bagaimana untuk melaksanakan pengekodan dan penyahkodan Base64 dalam php

PHPz
PHPzasal
2023-03-24 17:11:583697semak imbas

Algoritma Base64 ialah kaedah pengekodan yang menukar data binari kepada aksara ASCII, supaya data tidak boleh diubah suai atau rosak semasa penghantaran, dan kandungan sebenar data juga boleh disembunyikan. Dalam PHP, anda boleh menggunakan fungsi terbina dalam atau menulis kod secara manual untuk melaksanakan pengekodan dan penyahkodan Base64.

  1. Penggunaan fungsi PHP terbina dalam

PHP menyediakan dua fungsi terbina dalam base64_encode() dan base64_decode(), yang boleh dilakukan dengan mudah Base64 Codec. Berikut ialah cara menggunakannya:

Pengekodan Base64:

$encoded_data = base64_encode($data);

Antaranya, $data ialah data binari yang perlu dikodkan, dan $encoded_data ialah rentetan yang dikodkan. Berbeza daripada kaedah pengekodan lain (seperti pengekodan URL), rentetan yang dikodkan Base64 mungkin mengandungi aksara khas seperti "/" dan "+", yang perlu dilepaskan apabila dihantar dalam URL.

Base64 penyahkodan:

$decoded_data = base64_decode($encoded_data);

Antaranya, $encoded_data ialah rentetan yang dikodkan dan $decoded_data ialah data binari yang dinyahkod.

Kaedah ini adalah pelaksanaan yang paling mudah, tetapi apabila memproses data binari yang besar (seperti fail imej), ia akan menduduki sejumlah besar memori dan menyebabkan masalah prestasi.

  1. Tulis algoritma Base64 secara manual

Untuk memproses data binari yang besar, kami boleh menulis pelaksanaan algoritma Base64 secara manual. Berikut ialah kod untuk melaksanakan pengekodan dan penyahkodan Base64 secara manual dalam PHP:

// Base64编码
function base64_encode_php($data) {
$base64_map = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";
$base64_data = "";
$data_len = strlen($data);

for ($i = 0; $i < $data_len; $i += 3) {
    $chunk = ord(substr($data, $i, 3));
    $base64_data .= $base64_map[($chunk >> 2) & 0x3F];
    $base64_data .= $base64_map[(($chunk << 4) & 0x30) | ((ord(substr($data, $i + 1, 1)) >> 4) & 0x0F)];
    $base64_data .= (($i + 2) < $data_len) ? $base64_map[(ord(substr($data, $i + 1, 1)) << 2) & 0x3C | (ord(substr($data, $i + 2, 1)) >> 6) & 0x03] : "=";
    $base64_data .= (($i + 2) < $data_len) ? $base64_map[ord(substr($data, $i + 2, 1)) & 0x3F] : "=";
}

return $base64_data;
}


// Base64解码
function base64_decode_php($data) {
$base64_map = array(
    &#39;A&#39; => 0, &#39;B&#39; => 1, &#39;C&#39; => 2, &#39;D&#39; => 3, &#39;E&#39; => 4, &#39;F&#39; => 5, &#39;G&#39; => 6, &#39;H&#39; => 7,
    &#39;I&#39; => 8, &#39;J&#39; => 9, &#39;K&#39; => 10, &#39;L&#39; => 11, &#39;M&#39; => 12, &#39;N&#39; => 13, &#39;O&#39; => 14, &#39;P&#39; => 15,
    &#39;Q&#39; => 16, &#39;R&#39; => 17, &#39;S&#39; => 18, &#39;T&#39; => 19, &#39;U&#39; => 20, &#39;V&#39; => 21, &#39;W&#39; => 22, &#39;X&#39; => 23,
    &#39;Y&#39; => 24, &#39;Z&#39; => 25, &#39;a&#39; => 26, &#39;b&#39; => 27, &#39;c&#39; => 28, &#39;d&#39; => 29, &#39;e&#39; => 30, &#39;f&#39; => 31,
    &#39;g&#39; => 32, &#39;h&#39; => 33, &#39;i&#39; => 34, &#39;j&#39; => 35, &#39;k&#39; => 36, &#39;l&#39; => 37, &#39;m&#39; => 38, &#39;n&#39; => 39,
    &#39;o&#39; => 40, &#39;p&#39; => 41, &#39;q&#39; => 42, &#39;r&#39; => 43, &#39;s&#39; => 44, &#39;t&#39; => 45, &#39;u&#39; => 46, &#39;v&#39; => 47,
    &#39;w&#39; => 48, &#39;x&#39; => 49, &#39;y&#39; => 50, &#39;z&#39; => 51, &#39;0&#39; => 52, &#39;1&#39; => 53, &#39;2&#39; => 54, &#39;3&#39; => 55,
    &#39;4&#39; => 56, &#39;5&#39; => 57, &#39;6&#39; => 58, &#39;7&#39; => 59, &#39;8&#39; => 60, &#39;9&#39; => 61, &#39;+&#39; => 62, &#39;/&#39; => 63
);
$data_len = strlen($data);
$padding_count = substr_count($data, "=");
$binary_data = "";
$byte_count = 0;

for ($i = 0; $i < $data_len; $i++) {
    $char = $data[$i];

    if (isset($base64_map[$char])) {
        $byte_count++;
        $binary_data .= str_pad(decbin($base64_map[$char]), 6, "0", STR_PAD_LEFT);

        if ($byte_count == 4) {
            $byte_count = 0;

            $binary_data = substr($binary_data, 0, strlen($binary_data) - 8);
        }
    }
}

return substr($binary_data, 0, strlen($binary_data) - $padding_count * 8);
}

Kod ini terbahagi kepada dua bahagian: Pengekodan Base64 dan penyahkodan Base64.

  • Dalam bahagian pengekodan Base64, kami mula-mula menentukan jadual pemetaan Base64 $base64_map, yang digunakan untuk menukar data binari 6-bit kepada aksara Base64 yang sepadan. Kemudian, untuk data binari input, 3 bait dikeluarkan untuk diproses pada satu masa. Untuk setiap blok 3-bait data, kami akan membahagikannya kepada 4 blok 6-bit. Jika bilangan bait yang sedang diproses adalah kurang daripada 3 bait, aksara '=' perlu ditambah.

  • Dalam bahagian penyahkodan Base64, kami mula-mula mentakrifkan jadual pemetaan Base64 $base64_map, kali ini ia digunakan untuk menukar setiap aksara Base64 kepada data binari 6-bit. Untuk rentetan input Base64, kami menukarnya kepada data binari dan kemudian menukarnya kepada aksara ASCII dalam kumpulan 8 bit.

Walaupun kaedah ini agak kompleks, ia boleh meningkatkan prestasi dengan banyak kerana ia boleh memproses sejumlah besar data dalam ketulan.

Ringkasan

Sama ada anda menggunakan fungsi terbina dalam PHP atau menulis algoritma Base64 secara manual, anda boleh melakukan operasi pengekodan dan penyahkodan Base64 dengan mudah. Untuk data binari yang kecil, menggunakan fungsi terbina dalam sudah memadai, tetapi untuk memproses data binari yang besar, algoritma tulisan tangan boleh meningkatkan prestasi.

Atas ialah kandungan terperinci Bagaimana untuk melaksanakan pengekodan dan penyahkodan Base64 dalam php. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn