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==

参见

添加备注

用户贡献的备注 37 个备注

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
5 年前
在 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));
}

在 https://3v4l.org/aEs4o 中使用 random_bytes() 和随机长度进行了检查

https://3v4l.org/aEs4o
biziclop at vipmail dot hu
6 年前
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>";
}
?>
Hayley Watson
11 年前
大型文件的 Base64 编码。

Base64 编码将三个 8 位符号转换为四个 6 位符号。以三个字节的倍数长度读取输入文件会导致一个可以独立于输入文件的其余部分编码的块。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 进行实时编码的“函数”[已从手册中删除,转而使用此帖子] 有 2 个错误!
第一个错误导致无限循环,因为缺少“$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
function base64url_encode($data) {
return
rtrim(strtr(base64_encode($data), '+/', '-_'), '=');
}

function
base64url_decode($data) {
return
base64_decode(str_pad(strtr($data, '-_', '+/'), 4 - ((strlen($data) % 4) ?: 4), '=', STR_PAD_RIGHT));
}
?>
massimo dot scamarcia at gmail dot com
18 年前
function urlsafe_b64encode($string) {
$data = base64_encode($string);
$data = str_replace(array('+','/','='),array('-','_',''),$data);
return $data;
}

function urlsafe_b64decode($string) {
$data = str_replace(array('-','_'),array('+','/'),$string);
$mod4 = strlen($data) % 4;
if ($mod4) {
$data .= substr('====', $mod4);
}
return base64_decode($data);
}

PHP 版本的 Perl MIME::Base64::URLSafe,提供 URL 安全的 base64 字符串编码/解码(与 Python base64 的 urlsafe 方法兼容)
Daniel Klein
1 年前
对“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 开始(在我发布之前检查过的所有版本中都是如此),所以我删除了它。
dawgeatschikin at hotmail dot com
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==

function bencode($string='') {
$binval = convert_binary_str($string);
$final = "";
$start = 0;
while ($start < strlen($binval)) {
if (strlen(substr($binval,$start)) < 6)
$binval .= str_repeat("0",6-strlen(substr($binval,$start)));
$tmp = bindec(substr($binval,$start,6));
if ($tmp < 26)
$final .= chr($tmp+65);
elseif ($tmp > 25 && $tmp < 52)
$final .= chr($tmp+71);
elseif ($tmp == 62)
$final .= "+";
elseif ($tmp == 63)
$final .= "/";
elseif (!$tmp)
$final .= "A";
else
$final .= chr($tmp-4);
$start += 6;
}
if (strlen($final)%4>0)
$final .= str_repeat("=",4-strlen($final)%4);
return $final;
}

function convert_binary_str($string) {
if (strlen($string)<=0) return;
$tmp = decbin(ord($string[0]));
$tmp = str_repeat("0",8-strlen($tmp)).$tmp;
return $tmp.convert_binary_str(substr($string,1));
}

?>
jonb at wobblymusic dot com
14 年前
请注意,某些应用程序(例如 OpenSSL 的 enc 命令)要求每 64 个字符换行,才能使它们的 base64 解码函数正常工作。以下函数将解决此问题

<?php
function ($encodeMe) {
$data = base64_encode($encodeMe);
$datalb = "";
while (
strlen($data) > 64) {
$datalb .= substr($data, 0, 64) . "\n";
$data = substr($data,64);
}
$datalb .= $data;
return
$datalb;
}
?>
massimo dot scamarcia at gmail dot com
18 年前
$data = str_replace(array('+','/','='),array('-','_',),$data); // MIME::Base64::URLSafe 实现

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

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

return
$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);
return
$data;
}
?>
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=\"\" />";
?>
Andi
16 年前
我需要一个简单的方法来混淆数据库中自动增长的主键,当它们在 URI 或 API 调用中对用户可见时。用户不应该能够在 URL 中增加 ID 并查看数据库表中的下一条数据记录。

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

function base64url_encode($plainText) {

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

function base64url_decode($plainText) {

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

function encryptId($int, $class='') {

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

function decryptId($string, $class='') {

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

return 0;
}

$int = $parts[0];
return 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
function base64url_encode($plainText)
{
$base64 = base64_encode($plainText);
$base64url = strtr($base64, '+/', '-_');
return (
$base64url);
}
?>

您可能希望在 URI 中使用 rtrim(或转义)尾部的 “=” 字符。
guy at bhaktiandvedanta dot com
21 年前
您可以使用 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
andronick(dot)mail(dog)gmail(dot)com
13 年前
将图像输出到 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
17 年前
我在 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
18 年前
我使用 base64_encode 和 base64_decode 来处理 MySQL (使用 BLOB 字段) 和 MSSQL (使用 TEXT 字段) 中的文件附件。对于 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 图片等等(甚至压缩文件!!!)
ozziez_box at hotmail dot com
6 年前
关于 base64url,你可以直接使用

<?php
$encodedUrl
= urlencode(base64_encode($string));
$decodedUrl = base64_decode(url_decode($string));
?>
eric [at] d512 [dot] com
17 年前
请注意,至少一些 Windows 系统不会打印超过一定长度的字符行,除非它包含某种换行符。因此,如果你对文件进行 base-64 编码,然后将其打印回来进行调试,却什么也看不到,请不要惊慌。
alf at trance dot net
8 年前
@gutzmer at usa dot net

好主意!但是...

函数 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 在没有填充的情况下也能正常工作这就是为什么你的 function 能正常工作
gglockner AT NOSPAMdwaffler DOT com
15 年前
我在示例中省略了 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));
}
?>
virtuall at virtuall dot info
18 年前
如果你编码的文本包含像 < > 这样的符号,并且想要在 GET 查询中发送它,请确保对 base64_encode 的结果进行 urlencode,因为它有时会在末尾添加一个 +(这是一个特殊符号)

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

返回

PGh0bWw+

这样的函数可能也很有用

<?php
function base64_urlencode($str) {
return
urlencode(base64_encode($str));
};
?>
dlyaza aT yahoo DOT com
17 年前
使用函数
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==');
}
}
Anonymous
8 年前
维基百科列出了 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, "!-");

// base64 用于 YUI 库:
$encoded = base64_encode2($decoded, "._-");
$decoded = base64_decode2($encoded, false, "._-");
?>
sadhooklay [at] gmail [dot] com
9 年前
<?php
/**
* 生成一个随机的 URL 安全 base64 字符串。
*
* 有关 URL 安全 base64 的定义,请参见 RFC 3548。
* 如果未指定 $n,则假定为 Secure::RANDOM_LENGTH。将来可能更大。
*
* @param int $n 指定随机字符串的长度
* @param bool $padding
* @return string 结果可能包含 A-Z、a-z、0-9、“-” 和“_”。如果 $padding 为 true,则还使用“=”。
*/
public static function newToken($n = null, $padding = false)
{
// 生成一个新的唯一令牌
if (!function_exists('openssl_random_pseudo_bytes')) {
// 如果 openssl_random_pseudo_bytes 可用,则生成一个随机伪字节令牌
// 这比 uniqid 更安全,因为 uniqid 依赖于 microtime,而 microtime 是可预测的
$s = pack('a*', openssl_random_pseudo_bytes($n ?: static::RANDOM_LENGTH));
$s = str_replace(["\n", "\r", "\n\r"], '', $s);
} else {
// 否则,回退到哈希化的 uniqid
$s = substr(hash('sha256', uniqid(null, true)), 0, $n ?: static::RANDOM_LENGTH);
}

return
$padding ? strtr(base64_encode($s), '+/', '-_') : rtrim(strtr(base64_encode($s), '+/', '-_'), '=');
}
?>
raat1979 at gmail dot com
5 年前
最短的 base64url_decode(正确版本)

<?php
function base64_urldecode($data){
return
base64_decode(strtr($data,'-_','+/').str_repeat("=", -strlen($data) & 3));
}
?>
gglockner AT NOSPAMdwaffler DOT com
15 年前
我还有另一个简单而优雅的解决方案。创建一串伪随机字符。然后,每次你想混淆你的密钥时,就从伪随机字符串中追加一个随机子字符串,并使用 base64 编码。当你想要解混淆时,就从 base64 转换回来。如果前缀不在你的伪随机源中,那么该值就被伪造了。否则,就剥离前缀,恢复你的原始密钥。

优点是,即使是相同的密钥,字符串看起来也会不同,而且编码和解码速度应该非常快。

以下是一个示例

<?php

// 在首页加载时调用一次 makeCksum
function makeCksum() {
$str = "";
for (
$i=0;$i<32;++$i)
$str .= chr(rand(32,126));
$_SESSION['Cksum'] = $str;
}

function
encode($x) {
return
base64_encode(substr($_SESSION['Cksum'],rand(0,28),4) . $x);
}

function
decode($x) {
$y = base64_decode($x);
if (
strpos($_SESSION['Cksum'],substr($y,0,4)) === false) return false;
return
substr($y,4-strlen($y));
}
?>
peter at mailinator dot com
18 年前
如果你想在 Javascript 中解码 base64 编码的数据,你可以使用这个网站上的工具 (Webtoolkit.base64):http://www.webtoolkit.info/
raat1979 at gmail dot com
5 年前
最短的 base64url_decode

<?php
function base64url_decode($data){
return
base64_decode($data.str_repeat("=", -strlen($data) & 3));
}
?>
d_maksimov at inbox dot ru
2 年前
你可以使用两个简单的函数来转义 '+', '/' 和 '=' 符号

<?php
function base_encode($id) {
return
str_replace(["A", "+", "/", "="], ["AA", "AB", "AC", "AD"], base64_encode($id));
}

function
base_decode($id) {
$id = preg_replace_callback('/(AA)|(AB)|(AC)|(AD)/', function ($m) {
foreach([
'A', '+', '/', '='] as $i => $value)
if(
$m[$i + 1])
return
$value;
},
$id);
return
base64_decode($id);
}
?>

这些函数将符号 'A' 转换为 'AA','+' 转换为 'AB','/' 转换为 'AC','=' 转换为 'AD'。
To Top