Maison  >  Article  >  développement back-end  >  Comment implémenter l'encodage et le décodage Base64 en php

Comment implémenter l'encodage et le décodage Base64 en php

PHPz
PHPzoriginal
2023-03-24 17:11:583634parcourir

L'algorithme Base64 est une méthode de codage qui convertit les données binaires en caractères ASCII, de sorte que les données ne puissent pas être modifiées ou endommagées pendant la transmission, et que le véritable contenu des données puisse également être masqué. En PHP, vous pouvez utiliser des fonctions intégrées ou écrire manuellement du code pour implémenter l'encodage et le décodage Base64.

  1. Utilisation des fonctions intégrées de PHP

PHP fournit deux fonctions intégrées base64_encode() et base64_decode(), qui peuvent facilement effectuer l'encodage et le décodage Base64. Voici comment les utiliser :

Encodage Base64 :

$encoded_data = base64_encode($data);

Parmi eux, $data est les données binaires qui doivent être encodées, et $encoded_data est la chaîne encodée. Contrairement aux autres méthodes de codage (telles que le codage d'URL), la chaîne codée en Base64 peut contenir des caractères spéciaux tels que « / » et « + », qui doivent être échappés lors de la transmission dans l'URL.

Décodage Base64 :

$decoded_data = base64_decode($encoded_data);

Parmi eux, $encoded_data est la chaîne encodée et $decoded_data est les données binaires décodées.

Cette méthode est la mise en œuvre la plus simple, mais lors du traitement de données binaires volumineuses (telles que des fichiers image), elle occupera beaucoup de mémoire et entraînera des problèmes de performances.

  1. Algorithme Base64 écrit à la main

Afin de traiter des données binaires volumineuses, nous pouvons écrire manuellement l'implémentation de l'algorithme Base64. Voici le code pour implémenter manuellement l'encodage et le décodage Base64 en 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);
}

Ce code est principalement divisé en deux parties : l'encodage Base64 et le décodage Base64.

  • Dans la partie encodage Base64, nous définissons d'abord une table de mappage Base64 $base64_map, qui est utilisée pour convertir des données binaires 6 bits en caractères Base64 correspondants. Ensuite, pour les données binaires d'entrée, 3 octets sont extraits pour le traitement à la fois. Pour chaque bloc de données de 3 octets, nous le diviserons en 4 blocs de 6 bits. Si le nombre d'octets actuellement traités est inférieur à 3 octets, le caractère '=' doit être complété.

  • Dans la partie décodage Base64, nous définissons d'abord une table de mappage Base64 $base64_map, cette fois elle est utilisée pour convertir chaque caractère Base64 en données binaires 6 bits. Pour la chaîne Base64 d'entrée, nous la convertissons en données binaires puis la convertissons en caractères ASCII par groupes de 8 bits.

Bien que cette méthode soit relativement complexe, elle peut grandement améliorer les performances car elle peut traiter de grandes quantités de données en morceaux.

Résumé

Que vous utilisiez les fonctions intégrées de PHP ou que vous écriviez manuellement l'algorithme Base64, vous pouvez facilement effectuer des opérations d'encodage et de décodage Base64. Pour les petites données binaires, l'utilisation de fonctions intégrées est suffisante, mais pour le traitement de données binaires volumineuses, les algorithmes d'écriture manuelle peuvent améliorer les performances.

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn