MIME Base64编码

Posted kingchn

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了MIME Base64编码相关的知识,希望对你有一定的参考价值。

Base64是一种用于将二进制数据编码成可打印ASCII字符的编码方式。它由64个字符组成,包括A-Z、a-z、0-9以及+和/。它的编码规则非常简单:将3个字节的二进制数据(共24位)分成4组,每组6位,然后将这4组6位的值转换成一个可打印ASCII字符。

MIME Base64是Base64的一种变体,它是Multipurpose Internet Mail Extensions(MIME)协议规定的一种编码方式。MIME是一种电子邮件的扩展协议,用于在邮件中传输文本、图像、音频和视频等多媒体文件。在MIME协议中,二进制数据通常需要进行编码才能正确传输。MIME Base64就是用于将二进制数据编码成可打印ASCII字符的一种方式。

MIME Base64的用途非常广泛,常见的应用场景包括:

  1. 在电子邮件中传输二进制附件
  2. 在HTTP协议中传输二进制数据,例如图片、音频、视频等
  3. 在XML文件中传输二进制数据,例如SOAP消息

下面以Java语言为例,介绍如何使用MIME Base64编码和解码数据。

在Java语言中,可以使用Base64类提供的方法实现MIME Base64编码和解码。以下是一个示例:

import java.util.Base64;

public class Base64Demo 
    public static void main(String[] args) 
        String text = "Hello, world!";
        byte[] bytes = text.getBytes();
        String encoded = Base64.getMimeEncoder().encodeToString(bytes);
        System.out.println("Encoded: " + encoded);
        byte[] decoded = Base64.getMimeDecoder().decode(encoded);
        System.out.println("Decoded: " + new String(decoded));
    

如果需要在网页上进行MIME Base64编码和解码,可以使用一个在线工具:https://tool.hiofd.com/mime-base64-online/

该工具提供了简单易用的界面和实时的编码和解码结果展示,方便开发者进行调试和验证。

 

Perl/MIME 编码文本问题

【中文标题】Perl/MIME 编码文本问题【英文标题】:Perl/MIME encoded text trouble 【发布时间】:2011-04-30 21:43:07 【问题描述】:

我有一个 MIME 编码的消息(在 Maildir 中),它具有两个 base64 编码的标头(通过潜伏相关问题解决(Decode an UTF8 email header),解码('MIME-Header',$val),主体在纯文本和正文中的文本/纯 base64 编码数据中;

据说base64数据是用utf-8编码的。 但是,当我这样做时:

use MIME::Base4;
..
$decoded = decode_base64($block_from_line_array); # MIME body extracted from message's
$msgtext .= $decoded;
..
print decode('utf-8', $msgtext);

该块似乎解码错误。

print decode('utf-8', $msgtext); works ok, when message body is in utf-8

附上:

X-Priority: 3
X-Mailer: PHPMailer (phpmailer.sourceforge.net) [version 2.0.4]
X-Mailer: http://www.we.praise.buggy.php.scripts.what.we.do.when.we.dont.do.us
X-MessageID: 140
MIME-Version: 1.0
Content-Type: multipart/alternative;
 boundary="b1_16819d4d69564bfc0185ed5b9508ad31"

<Here the body begins -- mhambra>
--b1_16819d4d69564bfc0185ed5b9508ad31
Content-Type: text/plain; charset = "utf-8"
Content-Transfer-Encoding: base64
<MIME BLOCK>

已知邮件可以在 GMail 中正确显示。

【问题讨论】:

【参考方案1】:

在我正在测试的一些示例电子邮件中,FWIW Email::MIME 对我来说似乎很脆弱。 Email::Parser 对我来说效果更好,试图提取可能在 base64 中的 text/html 或 text/plain 段(并且通常具有传输编码 base64 / utf-8

use MIME::Parser;
use MIME::Base64;

sub flatten_parts 
    my ($mimePart, $fh) = @_;
    $fh or $fh = select;
    my $part;
    no strict 'refs';
    if($mimePart->mime_type =~ /text\/(plain|html)/i)
        my $base64=join('',@$mimePart->body); # This will be the base64 we're after.
        my $encoding = $mimePart->head->mime_encoding;
        if($encoding eq 'base64')
                my $plainContent=MIME::Base64::decode_base64($base64);
                print $plainContent;
        
       
    ### walk the parts:
    my @parts = $mimePart->parts;
    foreach $part (@parts) 
        flatten_parts($part, $fh);
    

### Create a new parser object:
our $parser = new MIME::Parser;
### Parse an input filehandle:
$entity = $parser->parse(\*STDIN);
flatten_parts($entity);

【讨论】:

【参考方案2】:

使用像Email::MIME 这样的模块来完成这项艰巨的工作。

use strict;
use warnings;
use Email::MIME;

my $msg = Email::MIME->new($message_text);
print $msg->body;

【讨论】:

【参考方案3】:

遗憾的是,如果您碰巧在 UTF8 格式的邮件中写了一个希腊 lambda,MIME::Parser barfs,并且似乎没有已知的解决方法 — 甚至不编辑所有 *.pm 文件,添加 use utf8; 等。

尝试在 Thunderbird 中打开一条新消息,附加一些文件,在正文中写入该 unicode 字符并将其保存为 .eml 文件。 MIME::Parser 会抛出错误。

另见CPAN Bug #105377。

【讨论】:

以上是关于MIME Base64编码的主要内容,如果未能解决你的问题,请参考以下文章

base64的MIME

从 mime 字节验证 base64 编码图像

从 Base64 编码的字符串中检索 MIME 类型

像图像或 PDF 文件这样的 MIME 类型不需要 base64 或以其他方式编码吗?

Perl/MIME 编码文本问题

Base-64编码介绍