base64_decode

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

base64_decode解码使用 MIME base64 编码的数据

描述

base64_decode(string $string, bool $strict = false): string|false

解码 base64 编码的 $string

参数

string

编码后的数据。

strict

如果 strict 参数设置为 true,则 base64_decode() 函数如果输入包含 base64 字母表之外的字符将返回 false。否则无效字符将被静默丢弃。

返回值

返回解码后的数据,或在失败时返回 false。返回的数据可能是二进制的。

示例

示例 #1 base64_decode() 示例

<?php
$str
= 'VGhpcyBpcyBhbiBlbmNvZGVkIHN0cmluZw==';
echo
base64_decode($str);
?>

上面的例子将输出

This is an encoded string

参见

添加注释

用户贡献注释 18 个注释

winkelnkemper at googlemail dot com
13 年前
如果你想保存从 Javascript canvas.toDataURL() 函数派生的数据,你必须将空格转换为加号。如果你不这样做,解码后的数据就会损坏

<?php
$encodedData
= str_replace(' ','+',$encodedData);
$decocedData = base64_decode($encodedData);
?>
Tom
17 年前
此函数支持 RFC 4648 第 5 节中描述的“base64url”,即“具有 URL 和文件名安全的字母表的 Base 64 编码”。

<?php
function base64url_decode($base64url)
{
$base64 = strtr($base64url, '-_', '+/');
$plainText = base64_decode($base64);
return (
$plainText);
}
?>
martinstaemmler at gmx dot net
14 年前
我在尝试让 base64_decode 解码超过 ~5k 个字符的 base64 字符串时遇到了一些麻烦。

base64 解码函数是模 4 和模 3 长度分段字符串之间的同态。这促使了一种分治法:将编码后的字符串拆分为模 4 个字符的子字符串,然后解码每个子字符串并将它们连接起来。

然后,代替

<?php $decoded = base64_decode($encoded); ?>

对于大型的 $encoded 字符串,使用以下代码更安全

<?php
$decoded
= "";
for (
$i=0; $i < ceil(strlen($encoded)/256); $i++)
$decoded = $decoded . base64_decode(substr($encoded,$i*256,256));
?>

其中 256 可以替换为足够小的模 4 自然数。
pete panic
6 个月前
请注意,填充字符不限于“=”。字符串末尾任何无法解码的字符将被解释为填充字符。如果 $strict 设置为 true,当然填充字符将限于 base64 字符。

示例

<?php
// $strict = false;
$str = 'VGhpcyBpcyBhbiBlbmNvZGVkIHN0cmluZw==';
echo
base64_decode($str); // This is an encoded string

$str = 'VGhpcyBpcyBhbiBlbmNvZGVkIHN0cmluZw';
echo
base64_decode($str); // This is an encoded string

$str = 'VGhpcyBpcyBhbiBlbmNvZGVkIHN0cmluZwA';
echo
base64_decode($str); // This is an encoded string

$str = 'VGhpcyBpcyBhbiBlbmNvZGVkIHN0cmluZwA=';
echo
base64_decode($str); // This is an encoded string

// $strict = true;
$str = 'VGhpcyBpcyBhbiBlbmNvZGVkIHN0cmluZw==';
echo
base64_decode($str, true); // This is an encoded string

$str = 'VGhpcyBpcyBhbiBlbmNvZGVkIHN0cmluZw';
echo
base64_decode($str, true); // This is an encoded string

$str = 'VGhpcyBpcyBhbiBlbmNvZGVkIHN0cmluZwA';
echo
base64_decode($str, true); // This is an encoded string

$str = 'VGhpcyBpcyBhbiBlbmNvZGVkIHN0cmluZwA=';
echo
base64_decode($str, true); // This is an encoded string
?>
walf
8 年前
用于 URL 参数/文件名的 Base64,符合 RFC 4648。
默认情况下,在编码时会丢弃填充,因为解码不需要填充,并且可以使 URL 不包含 % 编码。

<?php
function base64url_encode($data, $pad = null) {
$data = str_replace(array('+', '/'), array('-', '_'), base64_encode($data));
if (!
$pad) {
$data = rtrim($data, '=');
}
return
$data;
}
function
base64url_decode($data) {
return
base64_decode(str_replace(array('-', '_'), array('+', '/'), $data));
}
user at sfdsfd dot com
5 年前
function is_base64($str){
if($str === base64_encode(base64_decode($str))){
return true;
}
return false;
}

---------------------------------------------------------------------------
---------------------------------------------------------------------------
---------------------------------------------------------------------------

$str = 'VGhpcyBpcyBiYXNlNjQgZW5jb2RlIHN0cmluZw==';

if(is_base64($str)){
print base64_decode($str);
}
tobias at silverxnet dot de
20 年前
我想知道如何在邮件中解码附件图像。基本上它们大多是 JPEG 文件,所以很明显要编写一个解码 JPEG 图像的函数。
我认为最简单的方法如下

<?php
function base64_to_jpeg( $inputfile, $outputfile ) {
/* 读取数据(二进制) */
$ifp = fopen( $inputfile, "rb" );
$imageData = fread( $ifp, filesize( $inputfile ) );
fclose( $ifp );
/* 编码和写入数据(二进制) */
$ifp = fopen( $outputfile, "wb" );
fwrite( $ifp, base64_decode( $imageData ) );
fclose( $ifp );
/* 返回输出文件名 */
return( $outputfile );
}
?>

此函数解码给定的输入文件(一个文件名!)并将其保存到给定的输出文件(也是一个文件名),然后返回输出文件名以供进一步使用(例如,重定向、imagejpeg() 等)。
我认为这可能会有所帮助。
Starson
17 年前
为了扩展 Jes 的帖子

更改发生在 5.0.5 和 5.1.0 之间。确切的位置我并不知道也不关心。

简而言之,php <= 5.0.5 的 base64_decode( $string ) 将假设空格表示加号,而 php >= 5.1.0 的 base64_decode( $string ) 将不再进行此假设。我在更改日志中没有看到此说明。

请注意,截至撰写本文时,mb_convert_encoding( $string, "UTF-8", "BASE64" ) 仍然像 php <= 5.0.5 中的 base64_decode( $string ) 一样工作,无论您运行的是哪个版本的 php。
twm at twmacinta dot com
16 年前
为了跟进 Starson 的帖子,PHP 更改为不再将空格视为加号,这发生在 CVS 修订版 1.43.2.1 中,对应于 PHP 5.1.0。您可以通过与分支点 1.43 的差异查看发生了什么,

http://cvs.php.net/viewvc.cgi/php-src/ext/standard/base64.c

CVS 日志表明,此更改是为了修复 bug #34214(base64_decode() 无法正确忽略空格)。

从被删除的代码之前的注释中可以看出,将空格视为加号实际上曾经是故意的

当 Base64 被 POST 时,所有加号都会被解释为空格。
此行将它们改回。这并不完全符合 Base64 规范,
但它与规范完全兼容(规范指出空格
是无效的)。这也会让很多人省去很多
头痛。

if (ch == ' ') ch = '+';

但是,RFC 3548 指出,不在 Base64 字母表中的字符应该被忽略或导致实现拒绝编码,RFC 2045 说它们应该被忽略。因此,原始代码不幸地与规范或其他实现不完全兼容。它也可能掩盖了代码没有正确转义 POST 变量的问题。
debug
16 年前
@morgangalpin att gmail dotty com

一个更好的实现将是以下正则表达式

^[a-zA-Z0-9/+]*={0,2}$

这也会检测字符串末尾使用 = 或 ==(并且仅限末尾)。

如果此正则表达式不遵循正确的 RFC 指南,请对此进行评论。

专门针对此的函数

<?php

function is_base64_encoded()
{
if (
preg_match('%^[a-zA-Z0-9/+]*={0,2}$%', $data)) {
return
TRUE;
} else {
return
FALSE;
}
};

is_base64_encoded("iash21iawhdj98UH3"); // true
is_base64_encoded("#iu3498r"); // false
is_base64_encoded("asiudfh9w=8uihf"); // false
is_base64_encoded("a398UIhnj43f/1!+sadfh3w84hduihhjw=="); // true

?>
mcalwell
15 年前
我在 5.2.* 之前的服务器上测试 imap 消息主体是否为 base64 编码时遇到了问题。我在 5.2 之后的服务器上一直使用此函数。

我发现函数 imap_base64() 在无法解码字符串时返回 FALSE,我可以使用它来进行检查。

<?php
if(imap_base64($body)) $body = imap_base64($body);
?>
nsayer at kfu dot com
22 年前
我以前将 uudecode 作为 C 模块来使用,但我发现了一种在 PHP 中执行它的非常快速的方法。如下所示

<?php
function uudecode($encode) {
$b64chars="ABCDEFGHIJKLMNOPQRSTUVWXYZ\
abcdefghijklmnopqrstuvwxyz0123456789+/"
;

$encode = preg_replace("/^./m","",$encode);
$encode = preg_replace("/\n/m","",$encode);
for(
$i=0; $i<strlen($encode); $i++) {
if (
$encode[$i] == '`')
$encode[$i] = ' ';
$encode[$i] = $b64chars[ord($encode[$i])-32];
}

while(
strlen($encode) % 4)
$encode .= "=";

return
base64_decode($encode);
}
?>

这是 perl 中 unpack("u",___) 的 PHP 等效项。也就是说,您需要从典型的 uuencoded 文件中剥离“开始”和“结束”行。
nicolem2005 at gmail dot com
12 年前
base64_decode 在解码大文件/字符串时似乎会失败。我在解码一个 7MB 的图像文件时遇到了问题。以下是一个对我有用的解决方案

$decodedstring=base64_decode(chunk_split($encodedstring));
Klaus Fehrenbacher
21 年前
此脚本可以修复该错误

<?php
$enc
= chunk_split(preg_replace('!\015\012|\015|\012!','',$enc));
$enc = base64_decode($enc);
?>
markandrewslade at gmail dot com
8 年前
文档没有明确说明这一点,但如果您省略 `$strict` 或将其设置为 `false`,则编码输入中的无效字符将被静默忽略。

<?php

echo base64_decode('VGhpcyBpcyBhbiBlbmNvZGVkIHN0cmluZw=='); // "This is an encoded string"
echo base64_decode('$VGhpcyBpcyBhbiBlbmNvZGVkIHN0cmluZw=='); // "This is an encoded string"
echo base64_decode('$VGhpcyBpcyBhbiBlbmNvZGVkIHN0cmluZw==', true); // false

?>
alvaro at demogracia dot com
15 年前
如果您选择一个 4 的倍数的块长度,则可以进行部分解码(例如,从缓冲的输入流中)。

<?php

$encoded
= base64_encode('The quick brown fox jumps over the lazy dog');
for(
$i=0, $len=strlen($encoded); $i<$len; $i+=4){
echo
base64_decode( substr($encoded, $i, 4) );
}

?>

4 个编码后的字符代表 3 个原始字符。 “=” 字符用作填充。
zmorris at zsculpt dot com
16 年前
这是一个基于摩根加尔平代码的更快版本的 base64_decode() 的替代品

<?php
// 解决 php 4.3.11 到 4.4.7、5.1.2 到 5.2.4 以及其他版本(可能)的 bug (http://bugs.php.net/bug.php?id=37244)
function base64_decode_fix( $data, $strict = false )
{
if(
$strict )
if(
preg_match( '![^a-zA-Z0-9/+=]!', $data ) )
return(
false );

return(
base64_decode( $data ) );
}
?>
dimagolov at yahoo dot com
15 年前
这是一个将 Base 62(参见 http://en.wikipedia.org/wiki/Base_62)字符串解码为数字的函数。 它被 MTA 在消息 ID 中使用,例如 Exim
<?php
function base62_decode($str) {
$ret= 0;
for (
$i= 0, $l= strlen($str); $i < $l; $i++) {
$val= ord($str[$i]);
if (
ctype_digit($str[$i]))
$val-= ord('0');
else if (
ctype_upper($str[$i]))
$val-= ord('A') - 10;
else if (
ctype_lower($str[$i]))
$val-= ord('a') - 36;
else
$val= 0;
$ret= $ret * 62 + $val;
}
return
$ret;
}
?>
To Top