如果你想保存从 Javascript canvas.toDataURL() 函数派生的数据,你必须将空格转换为加号。如果你不这样做,解码后的数据就会损坏
<?php
$encodedData = str_replace(' ','+',$encodedData);
$decocedData = base64_decode($encodedData);
?>
(PHP 4, PHP 5, PHP 7, PHP 8)
base64_decode — 解码使用 MIME base64 编码的数据
返回解码后的数据,或在失败时返回 false
。返回的数据可能是二进制的。
示例 #1 base64_decode() 示例
<?php
$str = 'VGhpcyBpcyBhbiBlbmNvZGVkIHN0cmluZw==';
echo base64_decode($str);
?>
上面的例子将输出
This is an encoded string
如果你想保存从 Javascript canvas.toDataURL() 函数派生的数据,你必须将空格转换为加号。如果你不这样做,解码后的数据就会损坏
<?php
$encodedData = str_replace(' ','+',$encodedData);
$decocedData = base64_decode($encodedData);
?>
此函数支持 RFC 4648 第 5 节中描述的“base64url”,即“具有 URL 和文件名安全的字母表的 Base 64 编码”。
<?php
function base64url_decode($base64url)
{
$base64 = strtr($base64url, '-_', '+/');
$plainText = base64_decode($base64);
return ($plainText);
}
?>
我在尝试让 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 自然数。
请注意,填充字符不限于“=”。字符串末尾任何无法解码的字符将被解释为填充字符。如果 $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
?>
用于 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));
}
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);
}
我想知道如何在邮件中解码附件图像。基本上它们大多是 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() 等)。
我认为这可能会有所帮助。
为了扩展 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。
为了跟进 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 变量的问题。
@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
?>
我在 5.2.* 之前的服务器上测试 imap 消息主体是否为 base64 编码时遇到了问题。我在 5.2 之后的服务器上一直使用此函数。
我发现函数 imap_base64() 在无法解码字符串时返回 FALSE,我可以使用它来进行检查。
<?php
if(imap_base64($body)) $body = imap_base64($body);
?>
我以前将 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 文件中剥离“开始”和“结束”行。
base64_decode 在解码大文件/字符串时似乎会失败。我在解码一个 7MB 的图像文件时遇到了问题。以下是一个对我有用的解决方案
$decodedstring=base64_decode(chunk_split($encodedstring));
此脚本可以修复该错误
<?php
$enc = chunk_split(preg_replace('!\015\012|\015|\012!','',$enc));
$enc = base64_decode($enc);
?>
文档没有明确说明这一点,但如果您省略 `$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
?>
如果您选择一个 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 个原始字符。 “=” 字符用作填充。
这是一个基于摩根加尔平代码的更快版本的 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 ) );
}
?>
这是一个将 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;
}
?>