Eug*_*e K 3 delphi email base64 mime thunderbird
我正在寻找一种简单的方法,不涉及使用像Indy这样的东西来解码包含来自Thunderbird的消息所说的Base64.
例:
WW91ciBtZXNzYWdlDQoNCiAgVG86ICAgICAgeHh4QHh4eC5jb20NCiAgU3ViamVjdDogSXh4eA0KICBTZW50OiAgICBUaHUsIDIyIE9jdCAyMDA5IDAxOjE0OjM0IC0wNDAwDQoNCmRpZCBub3QgcmVhY2ggdGhlIGZvbGxvd2luZyByZWNpcGllbnQocyk6DQoNCnh4eEBneHh4IG9uIFR1ZSwgMjcgT2N0IDIwMDkgMDE6NDA6NDQgLTA0MDANCiAgICBUaGUgZS1tYWlsIHN5c3RlbSB3YXMgdW5hYmxlIHRvIGRlbGl2ZXIgdGhlIG1lc3NhZ2UsIGJ1dCBkaWQgbm90DQpyZXBvcnQgYSBzcGVjaWZpYyByZWFzb24uICBDaGVjayB0aGUgYWRkcmVzcyBhbmQgdHJ5IGFnYWluLiAgSWYgaXQgc3RpbGwNCmZhaWxzLCBjb250YWN0IHlvdXIgc3lzdGVtIGFkbWluaXN0cmF0b3IuDQogICAgPCBDaW54eHguY29tICM1LjAuMCBzbXRwOyA1LjQuNyAtIERlbGl2ZXJ5IGV4cGlyZWQNCihtZXNzYWdlIHRvbyBvbGQpICd0aW1lb3V0JyAoZGVsaXZlcnkgYXR0ZW1wdHM6IDApPg==
Run Code Online (Sandbox Code Playgroud)
成为:你的消息
To: xxx@xxx.com
Subject: Ixxx
Sent: Thu, 22 Oct 2009 01:14:34 -0400
did not reach the following recipient(s):
xxx@gxxx on Tue, 27 Oct 2009 01:40:44 -0400
The e-mail system was unable to deliver the message, but did not
report a specific reason. Check the address and try again. If it still
fails, contact your system administrator.
< Cinxxx.com #5.0.0 smtp; 5.4.7 - Delivery expired
(message too old) 'timeout' (delivery attempts: 0)>
Run Code Online (Sandbox Code Playgroud)
编辑:似乎MIME Base64行的最大长度可以是76.我必须解码每个76位长的行,而不是一次解码整个消息.谢谢.
从Delphi 6开始,Delphi包含了该EncdDecd
单元,其中包括DecodeString函数,该函数将Input
包含base64
文本的Result
字符串解码为具有实际解码数据(可能是二进制)的字符串:
function DecodeString(const Input: string): string;
Run Code Online (Sandbox Code Playgroud)
自Delphi 2009以来,它还包括DecodeBase64函数,它将Input
AnsiString 解码为TBytes的二进制文件Result
:
function DecodeBase64(const Input: AnsiString): TBytes;
Run Code Online (Sandbox Code Playgroud)
除了我之前给出的早期Delphi/PHP base64答案之外,我现在写了一个小单元测试,它显示了DecodeString和EncodeString如何工作:
unit Base64TestCaseUnit;
interface
uses
Classes, SysUtils, TestFrameWork, Generics.Collections;
{
base64 test vectors: http://tools.ietf.org/html/rfc4648
BASE64("") = ""
BASE64("f") = "Zg=="
BASE64("fo") = "Zm8="
BASE64("foo") = "Zm9v"
BASE64("foob") = "Zm9vYg=="
BASE64("fooba") = "Zm9vYmE="
BASE64("foobar") = "Zm9vYmFy"
}
const
Key_ = '';
Value_ = '';
Key_f = 'f';
Value_f = 'Zg==';
Key_fo = 'fo';
Value_fo = 'Zm8=';
Key_foo = 'foo';
Value_foo = 'Zm9v';
Key_foob = 'foob';
Value_foob = 'Zm9vYg==';
Key_fooba = 'fooba';
Value_fooba = 'Zm9vYmE=';
Key_foobar = 'foobar';
Value_foobar = 'Zm9vYmFy';
// binary test vector
Key_binary = #1#2#3#4;
Value_binary = 'AQIDBA==';
type
TStringStringDictionary = TDictionary<string, string>;
TBase64TestCase = class(TTestCase)
strict private
FBase64VectorsDictionary: TStringStringDictionary;
strict protected
procedure DecodeTestOneKey(const ExpectedKey: string); virtual;
procedure EncodeTestOneKey(const ActualKey: string); virtual;
property Base64VectorsDictionary: TStringStringDictionary read FBase64VectorsDictionary;
protected
procedure SetUp; override;
procedure TearDown; override;
published
{$IFDEF CLR}[Test]{$ENDIF}
procedure Base64_DecodeString_Test_;
{$IFDEF CLR}[Test]{$ENDIF}
procedure Base64_DecodeString_Test_binary;
{$IFDEF CLR}[Test]{$ENDIF}
procedure Base64_DecodeString_Test_f;
{$IFDEF CLR}[Test]{$ENDIF}
procedure Base64_DecodeString_Test_fo;
{$IFDEF CLR}[Test]{$ENDIF}
procedure Base64_DecodeString_Test_foo;
{$IFDEF CLR}[Test]{$ENDIF}
procedure Base64_DecodeString_Test_foob;
{$IFDEF CLR}[Test]{$ENDIF}
procedure Base64_DecodeString_Test_fooba;
{$IFDEF CLR}[Test]{$ENDIF}
procedure Base64_DecodeString_Test_foobar;
{$IFDEF CLR}[Test]{$ENDIF}
procedure Base64_EncodeString_Test_;
{$IFDEF CLR}[Test]{$ENDIF}
procedure Base64_EncodeString_Test_binary;
{$IFDEF CLR}[Test]{$ENDIF}
procedure Base64_EncodeString_Test_f;
{$IFDEF CLR}[Test]{$ENDIF}
procedure Base64_EncodeString_Test_fo;
{$IFDEF CLR}[Test]{$ENDIF}
procedure Base64_EncodeString_Test_foo;
{$IFDEF CLR}[Test]{$ENDIF}
procedure Base64_EncodeString_Test_foob;
{$IFDEF CLR}[Test]{$ENDIF}
procedure Base64_EncodeString_Test_fooba;
{$IFDEF CLR}[Test]{$ENDIF}
procedure Base64_EncodeString_Test_foobar;
end;
implementation
uses
EncdDecd;
procedure TBase64TestCase.Base64_DecodeString_Test_;
begin
DecodeTestOneKey(Key_);
end;
procedure TBase64TestCase.Base64_DecodeString_Test_binary;
begin
DecodeTestOneKey(Key_binary);
end;
procedure TBase64TestCase.Base64_DecodeString_Test_f;
begin
DecodeTestOneKey(Key_f);
end;
procedure TBase64TestCase.Base64_DecodeString_Test_fo;
begin
DecodeTestOneKey(Key_fo);
end;
procedure TBase64TestCase.Base64_DecodeString_Test_foo;
begin
DecodeTestOneKey(Key_foo);
end;
procedure TBase64TestCase.Base64_DecodeString_Test_foob;
begin
DecodeTestOneKey(Key_foob);
end;
procedure TBase64TestCase.Base64_DecodeString_Test_fooba;
begin
DecodeTestOneKey(Key_fooba);
end;
procedure TBase64TestCase.Base64_DecodeString_Test_foobar;
begin
DecodeTestOneKey(Key_foobar);
end;
procedure TBase64TestCase.SetUp;
begin
FBase64VectorsDictionary := TStringStringDictionary.Create();
FBase64VectorsDictionary.Add(Key_, Value_);
FBase64VectorsDictionary.Add(Key_f, Value_f);
FBase64VectorsDictionary.Add(Key_fo, Value_fo);
FBase64VectorsDictionary.Add(Key_foo, Value_foo);
FBase64VectorsDictionary.Add(Key_foob, Value_foob);
FBase64VectorsDictionary.Add(Key_fooba, Value_fooba);
FBase64VectorsDictionary.Add(Key_foobar, Value_foobar);
FBase64VectorsDictionary.Add(Key_binary, Value_binary);
end;
procedure TBase64TestCase.TearDown;
begin
FBase64VectorsDictionary.Free();
FBase64VectorsDictionary := nil;
end;
procedure TBase64TestCase.Base64_EncodeString_Test_;
begin
EncodeTestOneKey(Key_);
end;
procedure TBase64TestCase.Base64_EncodeString_Test_binary;
begin
EncodeTestOneKey(Key_binary);
end;
procedure TBase64TestCase.Base64_EncodeString_Test_f;
begin
EncodeTestOneKey(Key_f);
end;
procedure TBase64TestCase.Base64_EncodeString_Test_fo;
begin
EncodeTestOneKey(Key_fo);
end;
procedure TBase64TestCase.Base64_EncodeString_Test_foo;
begin
EncodeTestOneKey(Key_foo);
end;
procedure TBase64TestCase.Base64_EncodeString_Test_foob;
begin
EncodeTestOneKey(Key_foob);
end;
procedure TBase64TestCase.Base64_EncodeString_Test_fooba;
begin
EncodeTestOneKey(Key_fooba);
end;
procedure TBase64TestCase.Base64_EncodeString_Test_foobar;
begin
EncodeTestOneKey(Key_foobar);
end;
procedure TBase64TestCase.DecodeTestOneKey(const ExpectedKey: string);
var
ActualKey: string;
ExpectedValue: string;
begin
ExpectedValue := FBase64VectorsDictionary[ExpectedKey];
ActualKey := DecodeString(ExpectedValue);
Self.CheckEquals(ExpectedKey, ActualKey, Format('base64 decode of "%s" should be "%s"', [ExpectedValue, ExpectedKey]));
end;
procedure TBase64TestCase.EncodeTestOneKey(const ActualKey: string);
var
ActualValue: string;
ExpectedValue: string;
begin
ExpectedValue := FBase64VectorsDictionary[ActualKey];
ActualValue := EncodeString(ActualKey);
Self.CheckEquals(ExpectedValue, ActualValue, Format('base64 of "%s" should be "%s"', [ActualKey, ExpectedValue]));
end;
initialization
RegisterTest('', TBase64TestCase.Suite);
end.
Run Code Online (Sandbox Code Playgroud)
解码并不难编码,但这里有一个博客,里面有一些Delphi示例代码
http://www.delphifaq.net/how-to-base-64-mime-encode-and-decode-a-string/
基本思想是有64个字符,每个字符代表6位的位模式.使用表查找将字符转回6位,然后获取位列表,并将它们分解为8位块以生成字节.
归档时间: |
|
查看次数: |
6741 次 |
最近记录: |