delphi版本的Base64解码编码源代码
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
delphi版本的Base64解码编码源代码
Unit CnBase64;
Interface
Uses
SysUtils, Windows;
Function Base64Encode(InputData: String; Var OutputData: String): byte;
{* 对数据进行BASE64编码,如编码成功返回Base64_OK
|InputData:string - 要编码的数据
var OutputData: string - 编码后的数据
|
}
Function Base64Decode(InputData: String; Var OutputData: String): byte;
{* 对数据进行BASE64解码,如解码成功返回Base64_OK
|
InputData:string - 要解码的数据
var OutputData: string - 解码后的数据
|
}
Const
BASE64_OK = 0; // 转换成功
BASE64_ERROR = 1;
// 转换错误(未知错误)(e.g. can't encode octet in input stream) -> error in implementation BASE64_INV ALID = 2;
// 输入的字符串中有非法字符(在FilterDecodeInput=False 时可能出现)
BASE64_LENGTH = 3; // 数据长度非法
BASE64_DATALEFT = 4;
// too much input data left (receveived 'end of encoded data' but not end of input string) BASE64_PADDING = 5; // 输入的数据未能以正确的填充字符结束Implementation
Var
FilterDecodeInput: Boolean = true;
Const
Base64TableLength = 64;
Base64Table : String[Base64TableLength] =
'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+*'; Pad = '=';
Function Base64Encode(InputData: String; Var OutputData: String): byte;
Var
i : integer;
CurrentB, PrevB : byte;
c : byte;
s : char;
InputLength : integer;
Function ValueToCharacter(value: byte; Var character: char): Boolean;
//****************************************************************** // 将一个在0..Base64TableLength-1区间内的值,转换为与Base64编码相对应// 的字符来表示,如果转换成功则返回True
//****************************************************************** Begin
result := true;
If (value > Base64TableLength - 1) Then
result := false
Else
character := Base64Table[value + 1];
End;
Begin
OutputData := '';
InputLength := Length(InputData);
i := 1;
If (InputLength = 0) Then Begin
result := BASE64_OK;
Exit;
End;
Repeat
// 第一次转换
CurrentB := Ord(InputData[i]);
i := i + 1;
InputLength := InputLength - 1;
c := (CurrentB Shr 2);
If Not ValueToCharacter(c, s) Then Begin
result := BASE64_ERROR;
Exit;
End;
OutputData := OutputData + s;
PrevB := CurrentB;
// 第二次转换
If InputLength = 0 Then
CurrentB := 0
Else Begin
CurrentB := Ord(InputData[i]);
i := i + 1;
End;
InputLength := InputLength - 1;
c := (PrevB An
d $03) Shl 4 + (CurrentB Shr 4);
//取出XX后4位并将其左移4位与XX右移4位合并成六位If Not ValueToCharacter(c, s) Then
{//检测取得的字符是否在Base64Table内} Begin
result := BASE64_ERROR;
Exit;
End;
OutputData := OutputData + s;
PrevB := CurrentB;
// 第三次转换
If InputLength < 0 Then
s := Pad
Else Begin
If InputLength = 0 Then
CurrentB := 0
Else Begin
CurrentB := Ord(InputData[i]);
i := i + 1;
End;
InputLength := InputLength - 1;
c := (PrevB An
d $0F) Shl 2 + (CurrentB Shr 6);
//取出XX后4位并将其左移2位与XX右移6位合并成六位If Not ValueToCharacter(c, s) Then
{//检测取得的字符是否在Base64Table内} Begin
result := BASE64_ERROR;
Exit;
End;
End;
OutputData := OutputData + s;
// 第四次转换
If InputLength < 0 Then
s := Pad
Else Begin
c := (CurrentB An
d $3F); //取出XX后6位
If Not ValueToCharacter(c, s) Then
{//检测取得的字符是否在Base64Table内} Begin
result := BASE64_ERROR;
Exit;
End;
End;
OutputData := OutputData + s;
Until InputLength <= 0;
result := BASE64_OK;