>백엔드 개발 >PHP 문제 >PHP에서 Base64 인코딩 및 디코딩을 구현하는 방법

PHP에서 Base64 인코딩 및 디코딩을 구현하는 방법

PHPz
PHPz원래의
2023-03-24 17:11:583780검색

Base64 알고리즘은 바이너리 데이터를 ASCII 문자로 변환하는 인코딩 방식으로, 전송 중에 데이터가 수정되거나 손상될 수 없으며 데이터의 실제 내용도 숨길 수 있습니다. PHP에서는 내장 함수를 사용하거나 수동으로 코드를 작성하여 Base64 인코딩 및 디코딩을 구현할 수 있습니다.

  1. PHP 내장 함수 사용

PHP는 Base64 인코딩 및 디코딩을 편리하게 수행할 수 있는 base64_encode() 및 base64_decode() 두 가지 내장 함수를 제공합니다. 사용 방법은 다음과 같습니다.

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 디코딩의 두 부분으로 나뉩니다.

  • Base64 인코딩 부분에서는 먼저 6비트 바이너리 데이터를 해당 Base64 문자로 변환하는 데 사용되는 Base64 매핑 테이블 $base64_map을 정의합니다. 그런 다음 입력된 바이너리 데이터에 대해 한 번에 3바이트를 꺼내어 처리합니다. 각 3바이트 데이터 블록에 대해 4개의 6비트 블록으로 분할합니다. 현재 처리되는 바이트 수가 3바이트 미만인 경우 '=' 문자를 보완해야 합니다.

  • Base64 디코딩 부분에서는 먼저 Base64 매핑 테이블 $base64_map을 정의합니다. 이번에는 각 Base64 문자를 6비트 바이너리 데이터로 변환하는 데 사용됩니다. 입력 Base64 문자열의 경우 이를 이진 데이터로 변환한 다음 8비트 그룹의 ASCII 문자로 변환합니다.

이 방법은 비교적 복잡하지만, 많은 양의 데이터를 덩어리로 처리할 수 있기 때문에 성능을 크게 향상시킬 수 있습니다.

요약

PHP 내장 함수를 사용하든 Base64 알고리즘을 수동으로 작성하든 Base64 인코딩 및 디코딩 작업을 쉽게 수행할 수 있습니다. 작은 바이너리 데이터의 경우 내장 함수를 사용하는 것으로 충분하지만, 큰 바이너리 데이터를 처리하는 경우에는 손으로 쓰는 알고리즘을 사용하면 성능이 향상될 수 있습니다.

위 내용은 PHP에서 Base64 인코딩 및 디코딩을 구현하는 방법의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.