哪种方法是检测字符串是否为Base64编码的最佳方法(使用Delphi)?
您最好尝试解码它。如果解码失败,则输入未经base64编码。如果字符串成功解码,则输入可能已经进行了base64编码。
function StringIsBase64(const InputString : String ) : Boolean;
const
Base64Chars: Set of AnsiChar = ['A'..'Z','a'..'z','0'..'9','+','/','='];
var
i : integer;
begin
Result:=True;
for i:=1 to Length(InputString) do
{$IFDEF UNICODE}
if not CharInSet(InputString[i],Base64Chars) then
{$ELSE}
if not (InputString[i] in Base64Chars) then
{$ENDIF}
begin
Result:=False;
break;
end;
end;
=
字符用于填充,因此您可以为填充的base64字符串添加额外的验证功能,检查字符串的长度是否是4的倍数。function IsValidBase64(const aValue: string): Boolean;
var
i: Integer;
lValidChars: set of Char;
begin
Result := aValue <> '';
lValidChars := ['a'..'z', 'A'..'Z', '0'..'9', '/', '+'];
//length of string should be multiple of 4
if Length(aValue) mod 4 > 0 then
Result := False
else
for i := 1 to Length(aValue) do
begin
if aValue[i] = '=' then
begin
if i < Length(aValue) - 1 then
begin
Result := False;
Exit;
end
else
lValidChars := ['='];
end
else if not (aValue[i] in lValidChars) then
begin
Result := False;
Break;
end;
end;
end;
MightBeBase64
。 - David Heffernan=
是否只存在于末尾,并且只有一个或两个。 - The_FoxlValidChars
,这无法编译,但无论如何,您仍然认为空字符串有效;-) - TLamaRFC 4648
进行验证:
第5页,表格1
)function IsValidBase64EncodedString(const AValue: string): Boolean;
const
Base64Alphabet = ['A'..'Z', 'a'..'z', '0'..'9', '+', '/'];
var
I: Integer;
ValLen: Integer;
begin
ValLen := Length(AValue);
Result := (ValLen > 0) and (ValLen mod 4 = 0);
if Result then
begin
while (AValue[ValLen] = '=') and (ValLen > Length(AValue) - 2) do
Dec(ValLen);
for I := ValLen downto 1 do
if not (AValue[I] in Base64Alphabet) then
begin
Result := False;
Break;
end;
end;
end;
IsValidBase64EncodedString
是比CanBe...
更好的名称,因为它确实表明输入字符串是一个有效的base64编码字符串。 - kobik
TIdDecoderMIME
组件来解码一个无效的Base64字符串,则该组件不会引发任何异常或错误。 - RRUZ