Как определить, является ли строка Base64Encoded или нет? - PullRequest
6 голосов
/ 01 августа 2011

Какой лучший способ определить, является ли строка Base64Encoded или нет (с использованием Delphi)?

Ответы [ 4 ]

5 голосов
/ 01 августа 2011

Вы можете проверить, содержит ли строка только 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

5 голосов
/ 01 августа 2011

Лучшее, что вы можете сделать, это попытаться расшифровать его. Если декодирование завершается неудачно, то вход не был закодирован в base64. Если строка успешно декодирует, то входные данные могут быть закодированы в base64.

4 голосов
/ 01 августа 2011

В дополнение к ответу 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 и не настроен для использования Юникода.

3 голосов
/ 18 октября 2012

Как уже говорилось, нет достоверной проверки, является ли определенная строка кодированной 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;
...