PHP Conference Japan 2024

base64_encode

(PHP 4, PHP 5, PHP 7, PHP 8)

base64_encode使用MIME base64编码数据

描述

base64_encode(string $string): string

使用base64编码给定的string

此编码旨在使二进制数据能够通过非8位干净的传输层(例如邮件正文)传输。

Base64编码的数据比原始数据大约多占用33%的空间。

参数

string

要编码的数据。

返回值

编码后的数据,字符串形式。

示例

示例 #1 base64_encode() 示例

<?php
$str
= 'This is an encoded string';
echo
base64_encode($str);
?>

以上示例将输出

VGhpcyBpcyBhbiBlbmNvZGVkIHN0cmluZw==

参见

添加笔记

用户贡献笔记 32条笔记

gutzmer at usa dot net
13年前
对于任何对“base64url”变体编码感兴趣的人,您可以使用以下这对函数

<?php
function base64url_encode($data) {
return
rtrim(strtr(base64_encode($data), '+/', '-_'), '=');
}

function
base64url_decode($data) {
return
base64_decode(str_pad(strtr($data, '-_', '+/'), strlen($data) % 4, '=', STR_PAD_RIGHT));
}
?>
Rasmus Schultz
6年前
在PHP 7中,base64_decode()的填充问题不再存在 - 以下代码完全没问题

function base64_encode_url($string) {
return str_replace(['+','/','='], ['-','_',''], base64_encode($string));
}

function base64_decode_url($string) {
return base64_decode(str_replace(['-','_'], ['+','/'], $string));
}

此处使用random_bytes()和随机长度进行了检查

https://3v4l.org/aEs4o
biziclop at vipmail dot hu
7年前
gutzmer at usa dot net的(https://php.net/manual/en/function.base64-encode.php#103849)base64url_decode()函数不会用'='填充较长的字符串。这是一个修正版本

<?php
function base64url_encode( $data ){
return
rtrim( strtr( base64_encode( $data ), '+/', '-_'), '=');
}

function
base64url_decode( $data ){
return
base64_decode( strtr( $data, '-_', '+/') . str_repeat('=', 3 - ( 3 + strlen( $data )) % 4 ));
}

// 验证
for( $i = 0, $s = ''; $i < 24; ++$i, $s .= substr("$i", -1 )){
$base64_encoded = base64_encode( $s );
$base64url_encoded = base64url_encode( $s );
$base64url_decoded = base64url_decode( $base64url_encoded );
$base64_restored = strtr( $base64url_encoded, '-_', '+/')
.
str_repeat('=',
3 - ( 3 + strlen( $base64url_encoded )) % 4
);
echo
"$s<br>$base64url_decoded<br>$base64_encoded<br>$base64_restored<br>$base64url_encoded<br><br>";
}
?>
Daniel Klein
2年前
对“gutzmer at usa dot net”、“biziclop at vipmail dot hu”和“ivanm at duck dot com”的改进。

<?php
function base64url_encode($data) {
return
rtrim(strtr(base64_encode($data), '+/', '-_'), '=');
}

function
base64url_decode($data) {
return
base64_decode(strtr($data, '-_', '+/'));
}
?>

对于长度超过4个字符的字符串,填充均无效。解码函数中的“=”填充是多余的,至少从PHP 5.4版本开始(在我发帖前检查的版本中)就是这样,所以我将其删除了。
Hayley Watson
11年前
大型文件的Base64编码。

Base64编码将三个8位符号转换为四个6位符号。以3字节的倍数读取输入文件,可以独立于输入文件的其余部分对块进行编码。MIME还强制执行76个字符的长度限制,加上CRLF换行符。76个字符足以容纳19个四元组的6位符号,从而表示19个三元组的8位符号。读取57个8位符号可以提供刚好足够的数据来构成一个完整的MIME格式的行。最后,PHP的默认缓冲区大小为8192字节,足以容纳143行MIME格式的输入数据。

因此,如果您以8151字节(=57*143)为块大小从输入文件中读取数据,您将得到(最多)8151个8位符号,这些符号编码为正好10868个6位符号,然后正好转换为143行MIME格式的行。无需保留来自一个块到下一个块的剩余符号(6位或8位)。只需读取一个块,对其进行编码,将其写入,然后继续处理下一个块。显然,最后一个块可能较短,但其编码仍然独立于其余部分。

<?php

while(!feof($input_file))
{
$plain = fread($input_file, 57 * 143);
$encoded = base64_encode($plain);
$encoded = chunk_split($encoded, 76, "\r\n");
fwrite($output_file, $encoded);
}

?>

反之,每行76个字符的MIME格式的行(不包括尾随的CRLF)包含刚好足够的数据,可以输出57字节的数据,而无需保留需要添加到下一行的剩余位。这意味着每一行都可以独立于其他行进行解码,然后可以将解码后的块连接在一起或顺序写入。但是,这假设编码的数据确实是MIME格式的;如果没有这种保证,就必须接受base64数据不会如此方便地排列。
MitMacher
15年前
不幸的是,我2007年编写的用于即时Base64编码的“函数”(该函数已被删除,以支持此帖子)有两个错误!
第一个错误导致由于缺少“$feof”检查而出现无限循环,第二个错误在大型文件中编码失败时会导致罕见的错误,尤其是在
例如设置fgets($fh, 2) 的情况下。但是,低于1024的值总体上都不好,因为它们会减慢整个过程的速度,所以我想4096对于所有用途来说都足够了。
错误是由使用“empty()”引起的。

这是我已针对各种文件和长度(高达4.5 GB!)进行测试的更正版本,没有任何错误

<?php
$fh
= fopen('Input-File', 'rb');
//$fh2 = fopen('Output-File', 'wb');

$cache = '';
$eof = false;

while (
1) {

if (!
$eof) {
if (!
feof($fh)) {
$row = fgets($fh, 4096);
} else {
$row = '';
$eof = true;
}
}

if (
$cache !== '')
$row = $cache.$row;
elseif (
$eof)
break;

$b64 = base64_encode($row);
$put = '';

if (
strlen($b64) < 76) {
if (
$eof) {
$put = $b64."\n";
$cache = '';
} else {
$cache = $row;
}

} elseif (
strlen($b64) > 76) {
do {
$put .= substr($b64, 0, 76)."\n";
$b64 = substr($b64, 76);
} while (
strlen($b64) > 76);

$cache = base64_decode($b64);

} else {
if (!
$eof && $b64{75} == '=') {
$cache = $row;
} else {
$put = $b64."\n";
$cache = '';
}
}

if (
$put !== '') {
echo
$put;
//fputs($fh2, $put);
//fputs($fh2, base64_decode($put)); // for comparing
}
}

//fclose($fh2);
fclose($fh);
?>
luke at lukeoliff.com
13年前
我正在使用一个函数,将本地图像作为base64加密代码返回,即嵌入到HTML请求中的图像源。

这将大大减少您的页面加载时间,因为浏览器只需要向服务器发送一个请求即可获取整个页面,而不是为HTML和图像发送多个请求。请求需要上传,世界上99%的人的上传速度到服务器都是有限的。

<?php
function base64_encode_image ($filename=string,$filetype=string) {
if (
$filename) {
$imgbinary = fread(fopen($filename, "r"), filesize($filename));
return
'data:image/' . $filetype . ';base64,' . base64_encode($imgbinary);
}
}
?>

使用方法如下

<style type="text/css">
.logo {
background: url("<?php echo base64_encode_image ('img/logo.png','png'); ?>") no-repeat right 5px;
}
</style>

或者

<img src="<?php echo base64_encode_image ('img/logo.png','png'); ?>"/>
ivanm at duck dot com
2年前
对gutzmer at usa dot net (https://php.net/manual/en/function.base64-encode.php#103849) 和 biziclop at vipmail dot hu (https://php.net/manual/en/function.base64-encode.php#121767) 中的填充问题进行了细微改进

<?php
函数 base64url_encode($data) {
返回
rtrim(strtr(base64_encode($data), '+/', '-_'), '=');
}

函数
base64url_decode($data) {
返回
base64_decode(str_pad(strtr($data, '-_', '+/'), 4 - ((strlen($data) % 4) ?: 4), '=', STR_PAD_RIGHT));
}
?>
[email protected]
18年前
函数 urlsafe_b64encode($string) {
$data = base64_encode($string);
$data = str_replace(array('+','/','='),array('-','_',''),$data);
返回 $data;
}

函数 urlsafe_b64decode($string) {
$data = str_replace(array('-','_'),array('+','/'),$string);
$mod4 = strlen($data) % 4;
如果 ($mod4) {
$data .= substr('====', $mod4);
}
返回 base64_decode($data);
}

Perl 的 MIME::Base64::URLSafe 的 PHP 版本,提供 URL 安全的 base64 字符串编码/解码(与 Python base64 的 urlsafe 方法兼容)
[email protected]
18年前
只是对 massimo 函数的一个小修改。

<?
$data = str_replace(array('+','/','='),array('-','_','.'),$data);
// 将 '=' 替换为 '.' 而不是空字符串,这样过程是可逆的。根据 http://www.w3.org/Addressing/URL/5_URI_BNF.html,'.' 是 URI 安全的
?>
Gabriel Malca
18年前
如果函数不存在,这是一个混乱但有效的方法

<?

echo bencode("Gabriel Malca");
// R2FicmllbCBNYWxjYQ==

函数 bencode($string='') {
$binval = convert_binary_str($string);
$final = "";
$start = 0;
当 ($start < strlen($binval)) {
如果 (strlen(substr($binval,$start)) < 6)
$binval .= str_repeat("0",6-strlen(substr($binval,$start)));
$tmp = bindec(substr($binval,$start,6));
如果 ($tmp < 26)
$final .= chr($tmp+65);
否则如果 ($tmp > 25 && $tmp < 52)
$final .= chr($tmp+71);
否则如果 ($tmp == 62)
$final .= "+";
否则如果 ($tmp == 63)
$final .= "/";
否则如果 (!$tmp)
$final .= "A";
否则
$final .= chr($tmp-4);
$start += 6;
}
如果 (strlen($final)%4>0)
$final .= str_repeat("=",4-strlen($final)%4);
返回 $final;
}

函数 convert_binary_str($string) {
如果 (strlen($string)<=0) 返回;
$tmp = decbin(ord($string[0]));
$tmp = str_repeat("0",8-strlen($tmp)).$tmp;
返回 $tmp.convert_binary_str(substr($string,1));
}

?>
[email protected]
15年前
请注意,某些应用程序(例如 OpenSSL 的 enc 命令)要求每 64 个字符换行,才能使其 base64 解码函数正常工作。以下函数将解决此问题

<?php
函数 ($encodeMe) {
$data = base64_encode($encodeMe);
$datalb = "";
当 (
strlen($data) > 64) {
$datalb .= substr($data, 0, 64) . "\n";
$data = substr($data,64);
}
$datalb .= $data;
返回
$datalb;
}
?>
Naser Mirzaei
10年前
<?php
$image
= 'example.png';

// 读取图片路径,转换为 base64 编码
$imageData = base64_encode(file_get_contents($image));

// 格式化图片 SRC:data:{mime};base64,{data};
$src = 'data: '.mime_content_type($image).';base64,'.$imageData;

// 输出示例图片
echo "<img src=\"$src\" alt=\"\" />";
?>
[email protected]
18年前
$data = str_replace(array('+','/','='),array('-','_',),$data); // MIME::Base64::URLSafe 实现

$data = str_replace(array('+','/'),array('-','_'),$data); // 如果解码时移除“=”字符,Python 会引发“TypeError: Incorrect padding”错误
[email protected]
20年前
如果使用 base64 编码的字符串作为 cookie 名称,请确保移除“=”字符。至少 Internet Explorer 会拒绝包含“=”字符或包含 %xx 字符替换的 URL 编码 cookie 名称。使用以下函数将 base64 编码的字符串转换为纯字母(也去除“/”和“+”字符)

<?php
函数 base64clean($base64string)
{
$base64string = str_replace(array('=','+','/'),'',$base64string);

返回
$base64string;
}
?>
Gerard
11年前
要使 base64_encode 编码的 URL 安全字符串与 .net HttpServerUtility.UrlTokenEncode 函数兼容,请使用此方法

<?php
url_safe_base64_encode
($string)
{
// 首先进行 base64 编码
$data = base64_encode($string);

// Base64 字符串可能以多个“=”字符结尾。这些需要转换为数字
$no_of_eq = substr_count($data, "=");
$data = str_replace("=", "", $data);
$data = $data.$no_of_eq;

// 然后替换所有非 URL 安全字符
$data = str_replace(array('+','/'),array('-','_'),$data);
返回
$data;
}
?>
Andi
16年前
我需要一种简单的方法来混淆数据库中自增主键,当它们在 URI 或 API 调用中对用户可见时。用户不应该能够递增 URL 中的 ID 并查看数据库表中的下一个数据记录。

我的解决方案(使用 Tom 修改后的 base64 函数)

函数 base64url_encode($plainText) {

$base64 = base64_encode($plainText);
$base64url = strtr($base64, '+/=', '-_,');
返回 $base64url;
}

函数 base64url_decode($plainText) {

$base64url = strtr($plainText, '-_,', '+/=');
$base64 = base64_decode($base64url);
返回 $base64;
}

函数 encryptId($int, $class='') {

返回 base64url_encode($int.'-'.substr(sha1($class.$int.encryptionKey), 0, 6));
}

函数 decryptId($string, $class='') {

$parts = explode('-', base64url_decode($string));
如果 (count($parts) != 2) {

返回 0;
}

$int = $parts[0];
返回 substr(sha1($class.$int.encryptionKey), 0, 6) === $parts[1]
? (int)$int
: 0;
}

- 可选的第二个参数是类名,因此不同表的两个相同 ID 不会产生两个相同的混淆 ID。

- encryptionKey 是一个用于加密的全局密钥。

- decryptId() 检查 base64 编码字符串的第二部分是否正确。
Tom
17年前
此函数支持 RFC 4648 第 5 节中描述的“base64url”,即“使用 URL 和文件名安全字母表的 Base 64 编码”

<?php
函数 base64url_encode($plainText)
{
$base64 = base64_encode($plainText);
$base64url = strtr($base64, '+/', '-_');
返回 (
$base64url);
}
?>

您可能希望为在 URI 中使用而删除(或转义)尾部的“=”。
[email protected]
22年前
您可以使用 base64_encode 将图像文件转换为字符串文本,然后显示它们。我用它将我的图像存储在数据库中并从那里显示它们。首先,我使用 fread 打开文件,对结果进行编码,并将该结果存储在数据库中。对于创建随机图像很有用。

image.php

<?

header("Content-Type: image/jpeg");
header("Content-Disposition: inline");
$sql = "SELECT data FROM image where name='".$img."'";
$result = mysql_query($sql);
$row = mysql_fetch_row($result);
$image = $row[0];
echo base64_decode($image);

?>

在 html 文件中,您放置

<img src="image.php?img=test3" border="0" alt="">

Guy Laor
[email protected]
14年前
将图像输出到 html

<?php

$imgfile
= "test.gif";

$handle = fopen($filename, "r");

$imgbinary = fread(fopen($imgfile, "r"), filesize($imgfile));

echo
'<img src="data:image/gif;base64,' . base64_encode($imgbinary) . '" />';

?>

gif - data:image/gif;base64,...
jpg - data:image/jpeg;base64,...
png - data:image/png;base64,...
等等。
php at ianco dot co dot uk
18年前
我发现PHP 4.3.9的base64_encode(或者可能是echo)存在长度限制。
这段代码对我来说运行良好
<?php
echo strlen(str_repeat('-', 3273)); // 3273
echo strlen(base64_encode(str_repeat('-', 3273))); // 4364
echo base64_encode(str_repeat('-', 3273)); // 重复的LS0t
?>
但是将长度更改为3274,第三个echo则什么也不输出。
<?php
echo strlen(str_repeat('-', 3274)); // 3274
echo strlen(base64_encode(str_repeat('-', 3274))); // 4368
echo base64_encode(str_repeat('-', 3274)); // 完全没有输出
?>
如果要编码一个相当大的序列化数组并将其回显到表单字段,则这显然会产生影响。
divinity76 at gmail dot com
3年前
如果你出于某种原因需要base10/纯数字编码,则可以编码为0123456789的某种组合

<?php
// 使用字典0123456789进行base10编码
function base10_encode(string $str): string
{
$ret = "";
for (
$i = 0, $imax = strlen($str); $i < $imax; ++ $i) {
$ret .= str_pad((string) ord($str[$i]), 3, "0", STR_PAD_LEFT);
}
return
$ret;
}
// 使用字典0123456789进行base10解码
function base10_decode(string $str): string
{
$ret = "";
for (
$i = 0, $imax = strlen($str); $i < $imax; $i += 3) {
// 值得注意的是,这里我们使用(int)来去除零..
$ret .= chr((int) substr($str, $i, 3));
}
return
$ret;
}
?>

它是Unicode安全的和二进制安全的,正在测试中

<?php
//简单的ASCII测试:
$d=[];
$d["raw"]="test";
$d["b10"]=base10_encode($d["raw"]); // 116101115116
$d["decoded"]=base10_decode($d["b10"]); // test
$d["corrupted"]=$d["raw"]!==$d["decoded"]; // false
var_dump($d);
// 复杂的Unicode测试:
$d=[];
$d["raw"]="ˈmaʳkʊs kuːn ℕ ⊆ ℕ₀ ⊂ ℤ ⊂ ℚ ⊂ ℝ ⊂ ℂ, ⊥ < a ≠ b ≡ c ≤ d ≪ ⊤ ⇒ (A ⇔ B), Σὲ γνωρίζω ἀπὸ τὴν κόψη Οὐχὶ ταὐτὰ παρίσταταί გთხოვთ ሰማይ አይታረስ ንጉሥ አይከሰስ ᚻᛖ ᚳᚹᚫᚦ ᚦᚫᛏ ᚻᛖ ᛒᚢᛞᛖ ᚩᚾ ᚦᚫᛗ ᛚᚪᚾᛞᛖ ᚾᚩᚱᚦᚹᛖᚪᚱᛞᚢᛗ ᚹᛁᚦ ᚦᚪ ᚹᛖᛥᚫ ";
// 让我们添加一些象棋来进行良好的衡量
$d["raw"].="♔♕♖♗♘♙♚♛♜♝♞🙾🙿";
$d["b10"]=base10_encode($d["raw"]); //
$d["decoded"]=base10_decode($d["b10"]);
$d["corrupted"]=$d["raw"]!==$d["decoded"]; // false,base10是Unicode安全的:D
var_dump($d);
// 二进制安全测试:
$everything="";
for(
$i=0;$i<=0xFF;++$i){
$everything.=chr($i);
}
$d=[];
$d["raw"]=$everything;
$d["b10"]=base10_encode($d["raw"]);
$d["decoded"]=base10_decode($d["b10"]);
$d["corrupted"]=$d["raw"]!==$d["decoded"]; // false :D base10是二进制安全的。
var_dump($d);

?>
markrose at markrose dot ca
13年前
一种更快的方法是在每64个字符处换行,可以使用chunk_split函数

<?php
$string
= chunk_split(base64_encode($string), 64, "\n");
?>
Cristiano Calligaro
19年前
我已经在MySQL(使用BLOB字段)和MSSQL(使用TEXT字段)中使用base64_encode和base64_decode进行文件附件。对于MSSQL,请记住在PHP.INI文件中将mssql.textsize和mssql.textlimit都设置为2147483647。

这是代码

######### MSSQL(mssql_)/MySQL(mysql_)文件附件
$val=$HTTP_POST_FILES['lob_upload']['tmp_name'];
$valn=$HTTP_POST_FILES['lob_upload']['name'];
$valt=$HTTP_POST_FILES['lob_upload']['type'];

$data = base64_encode(addslashes(fread(fopen($val, "r"), filesize($val))));

mssql_connect("srv","usr","pass") or die ("");
mssql_select_db("db") or die ("");
$query = "UPDATE $table SET $field='$data', $fieldname='$valn', $fieldtype='$valt' WHERE DocID='$DocID'";
$result = mssql_query($query) or die(mssql_error());
mssql_close();

######### MSSQL(mssql_)/MySQL(mysql_) 文件附加
mssql_connect("srv","usr","pass") or die ("");
mssql_select_db("db") or die ("");
$query = "SELECT $field,$fieldtype FROM $table WHERE DocID='$DocID'";
$result = mssql_query($query) or die(mssql_error());
$row = mssql_fetch_array($result);

header("Content-type: $row[1]");
echo stripslashes(base64_decode($row[0]));

此策略适用于 Microsoft Word、Acrobat PDF、JPG 图片等(甚至压缩文件!!!)
[email protected]
6年前
关于 base64url,您可以使用

<?php
$encodedUrl
= urlencode(base64_encode($string));
$decodedUrl = base64_decode(url_decode($string));
?>
[email protected]
18年前
请注意,至少某些 Windows 系统除非有某种换行符,否则无法打印超过一定长度的字符行。因此,如果您对文件进行 base-64 编码,将其打印回以进行调试,并且没有看到任何内容,请不要惊慌。
[email protected]
8年前
@[email protected]

好主意!但是……

函数 base64url_decode 不会填充长度超过 4 个字符的字符串。
只有当第二个参数大于原始字符串的长度时,str_pad 才会填充字符串。因此,正确的函数应该是

<?php
function base64url_decode($data) {
$len = strlen($data);
return
base64_decode(str_pad(strtr($data, '-_', '+/'), $len + $len % 4, '=', STR_PAD_RIGHT));
}

请注意,base64_decode 即使没有填充也能正常工作这就是您的函数起作用的原因
[email protected]
16年前
我在示例中省略了 strtr 函数。以下是更正后的函数

<?php
function encode($x) {
return
strtr(base64_encode(substr($_SESSION['Cksum'],rand(0,28),4) . $x), '+/=', '-_~');
}

function
decode($x) {
$y = base64_decode(strtr($x, '-_~', '+/='));
if (
strpos($_SESSION['Cksum'],substr($y,0,4)) === false) return false;
return
substr($y,4-strlen($y));
}
?>
[email protected]
18年前
如果您编码包含 < > 等符号的文本并想将其发送到 GET 查询中,请确保对 base64_encode 的结果进行 urlencode,因为它有时会在末尾添加一个 +(这是一个特殊符号)

<?php
echo base64_encode('<html>');
?>

返回

PGh0bWw+

这样的函数也可能很有用

<?php
function base64_urlencode($str) {
return
urlencode(base64_encode($str));
};
?>
[email protected]
18年前
使用函数
HTML 输出
<img src="$self?image=file" border="0" alt="file">
<img src="$self?image=folder" border="0" alt="folder">

function getimage ($image) {
switch ($image) {
case 'file'
return base64_decode('R0lGODlhEQANAJEDAJmZmf///wAAAP///yH5BAHoAwMALAAAA
AARAA0AAAItnIGJxg0B42rsiSvCA/REmXQWhmnih3LUSGaqg35vF
bSXucbSabunjnMohq8CADsA');
case 'folder'
return base64_decode('R0lGODlhEQANAJEDAJmZmf///8zMzP///yH5BAHoAwMALAAAAA
ARAA0AAAIqnI+ZwKwbYgTPtIudlbwLOgCBQJYmCYrn+m3smY5v
Gc+0a7dhjh7ZbygAADsA');
case 'hidden_file'
return base64_decode('R0lGODlhEQANAJEDAMwAAP///5mZmf///yH5BAHoAwMALAAAA
AARAA0AAAItnIGJxg0B42rsiSvCA/REmXQWhmnih3LUSGaqg35vF
bSXucbSabunjnMohq8CADsA');
case 'link'
return base64_decode('R0lGODlhEQANAKIEAJmZmf///wAAAMwAAP///wAAAAAAAAAAA
CH5BAHoAwQALAAAAAARAA0AAAM5SArcrDCCQOuLcIotwgTYUll
NOA0DxXkmhY4shM5zsMUKTY8gNgUvW6cnAaZgxMyIM2zBLCaHlJgAADsA');
case 'smiley'
return base64_decode('R0lGODlhEQANAJECAAAAAP//AP///wAAACH5BAHoAwIALAAAA
AARAA0AAAIslI+pAu2wDAiz0jWD3hqmBzZf1VCleJQch0rkdnppB3
dKZuIygrMRE/oJDwUAOwA=');
case 'arrow'
return base64_decode('R0lGODlhEQANAIABAAAAAP///yH5BAEKAAEALAAAAAARAA0AA
AIdjA9wy6gNQ4pwUmav0yvn+hhJiI3mCJ6otrIkxxQAOw==');
}
}
匿名用户
9年前
维基百科列出了 Base64 中最后两个字符的 8 种左右变体(https://en.wikipedia.org/wiki/Base64)。以下函数可以处理所有这些变体

<?php
function base64_encode2($data, $a = "+/=") {
$l = strlen($a);
if (
$l === 3) {
return
strtr(base64_encode($data), "+/=", $a);
} else if (
$l === 2) {
return
rtrim(strtr(base64_encode($data), "+/", $a), '=');
} else {
throw new
InvalidArgumentException("Argument #2 must be 2 or 3 bytes.");
}
}

function
base64_decode2($data, $strict = false, $a = "+/=") {
$l = strlen($a);
if (
$l === 3) {
return
base64_decode(strtr($data, $a, "+/="), $strict);
} else if (
$l === 2) {
return
base64_decode(strtr($data, $a, "+/"), $strict);
} else {
throw new
InvalidArgumentException("Argument #2 must be 2 or 3 bytes.");
}
}
?>

示例用法

<?php
$decoded
= "ABC123";

// base64 XML 标识符:
$encoded = base64_encode2($decoded, "_:");
$decoded = base64_decode2($encoded, false, "_:");

// base64 URL (RFC 6920):
// base64 XML 名称标记:
$encoded = base64_encode($decoded, "-_")
$decoded = base64_decode($encoded, false, "-_");

// 修改后的 base64 XML 名称标记:
$encoded = base64_encode2($decoded, ".-");
$decoded = base64_decode2($encoded, false, ".-");

// 用于正则表达式的修改后的 base64:
$encoded = base64_encode2($decoded, "!-");
$decoded = base64_decode2($encoded, false, "!-");

// YUI 库中使用的 base64:
$encoded = base64_encode2($decoded, "._-");
$decoded = base64_decode2($encoded, false, "._-");
?>
[email protected]
6年前
最短的 base64url_decode(正确版本)

<?php
函数 base64_urldecode($data){
返回
base64_decode(strtr($data,'-_','+/').str_repeat("=", -strlen($data) & 3));
}
?>
To Top