哪种方法可以检测字符串是否为Base64Encoded(使用Delphi)?
答案 0 :(得分:5)
你能做的最好就是尝试解码它。如果解码失败,则输入不是base64编码的。字符串成功解码后输入可能已经被base64编码。
答案 1 :(得分:5)
您可以检查字符串是否仅包含Base64 valids chars
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字符串,检查字符串的长度是否为mod 4
答案 2 :(得分:4)
除了RRUZ答案,您还可以检查字符串的长度(是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;
请注意,此代码是Delphi 7代码,未针对Unicode使用进行调整。
答案 3 :(得分:3)
正如在这里已经说过的,如果某个字符串是否为Base64编码,则没有可靠的验证,因此即使您将输入视为有效的Base64编码字符串,也不意味着该字符串实际上是以这种方式编码的。我在这里发布了另一个版本的验证函数,根据RFC 4648
验证:
Page 5, Table 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;