ホームページ >バックエンド開発 >PHPの問題 >PHPでBase64エンコードとデコードを実装する方法

PHPでBase64エンコードとデコードを実装する方法

PHPz
PHPzオリジナル
2023-03-24 17:11:583748ブラウズ

Base64 アルゴリズムは、バイナリ データを ASCII 文字に変換するエンコード方式で、送信中にデータが変更されたり破損したりすることがなく、データの本当の内容も隠すことができます。 PHP では、組み込み関数を使用するか、コードを手動で記述して、Base64 エンコードとデコードを実装できます。

  1. PHP 組み込み関数の使用

PHP には、簡単に実行できる 2 つの組み込み関数base64_encode() とbase64_decode() が用意されています。 Base64 コーデック。使用方法は次のとおりです。

Base64 エンコード:

$encoded_data = base64_encode($data);

このうち、$data はエンコードが必要なバイナリ データ、$encoded_data はエンコードされた文字列です。他のエンコード方法 (URL エンコードなど) とは異なり、Base64 でエンコードされた文字列には、URL で送信するときにエスケープする必要がある「/」や「 " などの特殊文字が含まれる場合があります。

Base64 デコード:

$decoded_data = base64_decode($encoded_data);

このうち、$encoded_data はエンコードされた文字列、$decoded_data はデコードされたバイナリ データです。

この方法は最も単純な実装ですが、大きなバイナリ データ (画像ファイルなど) を処理する場合、大量のメモリを占有し、パフォーマンスの問題が発生します。

  1. Base64 アルゴリズムを手動で作成する

大きなバイナリ データを処理するために、Base64 アルゴリズムの実装を手動で作成できます。以下は、PHP で Base64 エンコードとデコードを手動で実装するコードです。

// 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);
}

このコードは主に、Base64 エンコードと Base64 デコードの 2 つの部分に分かれています。

  • Base64 エンコード部分では、最初に Base64 マッピング テーブル $base64_map を定義します。これは、6 ビット バイナリ データを対応する Base64 文字に変換するために使用されます。そして、入力されたバイナリデータを3バイトずつ取り出して処理します。データの 3 バイト ブロックごとに、4 つの 6 ビット ブロックに分割します。現在処理されているバイト数が 3 バイト未満の場合は、「=」文字を補足する必要があります。

  • Base64 デコード部分では、まず Base64 マッピング テーブル $base64_map を定義します。今回は、各 Base64 文字を 6 ビット バイナリ データに変換するために使用されます。入力 Base64 文字列の場合は、バイナリ データに変換してから、8 ビットのグループの ASCII 文字に変換します。

この方法は比較的複雑ですが、大量のデータをチャンクで処理できるため、パフォーマンスを大幅に向上させることができます。

概要

PHP 組み込み関数を使用する場合でも、手動で Base64 アルゴリズムを作成する場合でも、Base64 のエンコードおよびデコード操作を簡単に実行できます。小さなバイナリ データの場合は、組み込み関数を使用するだけで十分ですが、大きなバイナリ データを処理する場合は、手書きアルゴリズムを使用するとパフォーマンスを向上させることができます。

以上がPHPでBase64エンコードとデコードを実装する方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。