如何检测字符串是否为Base64Encoded?

时间:2011-08-01 06:49:02

标签: delphi encoding character-encoding

哪种方法可以检测字符串是否为Base64Encoded(使用Delphi)?

4 个答案:

答案 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验证:

  • 如果输入字符串不为空且其长度为4
  • 的倍数
  • 如果输入字符串最多包含两个填充字符且仅在字符串的末尾
  • 如果输入字符串仅包含Base64字母表中的字符(请参阅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;