Codage en base64 de chaînes unicode

Contenu du snippet

Je cherchais depuis un certain temps comment faire pour coder des chaînes Unicode en base64 mais ne trouvant pas de code sur le Net j'ai décider de le faire moi même à partir de zéro. Les seuls codes trouvé sur le Net sont soit pour coder des chaînes ASCII (ANSI) soit pour coder des bytes en ASCII (ANSI)

Source / Exemple :


unit untComBase64;

// Version Unicode by gta126

interface

uses SysUtils;

function encode64(s: string): string;
function decode64(s: string): string;

implementation

const
  tabChar = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/';

function encode64(s: string): string;
var
  i       : Integer; // compteur
  charCode: Integer; // code du caractère dans la table Unicode
  valToDec: Integer; // valeur à décrémenter au fur à mesure de la conversion
  nbrBits : Integer; // nombre de bits actuellement dans vaToDec (maximum 16 + 4)
  charPos : Integer; // position dans le tableau de codage en base64
begin
  Result   := '';
  charCode := 0;
  nbrBits  := 0;
  valToDec := 0;

  //parcours des caractères
  for i := 1 to Length(s) do
  begin
    charCode := Ord(s[i]);
    nbrBits  := nbrBits + 16;
    valToDec := (valToDec shl 16) + charCode;

    // traiter les bits tant que l'on sais faire des groupements de 6
    while (nbrBits - 6) >= 0 do
    begin
      nbrBits  := nbrBits - 6;
      charPos  := valToDec shr nbrBits;
      valToDec := valToDec - (charPos shl nbrBits);
      Result   := Result + tabChar[charPos + 1];
    end;
  end;

  // gestion des desniers bits + ajout des compléments
  if nbrBits > 0 then
  begin
    charPos := valToDec shl (6 - nbrBits);
    Result  := Result + tabChar[charPos + 1];

    for i := 1 to (6 - nbrBits) div 2 do
      Result := Result + '=';
  end;
end;

function decode64(s: string): string;
var
  i       : Integer; // compteur
  charPos : Integer; // position dans le tableau de codage en base64
  valToDec: Integer; // valeur à décrémenter au fur à mesure de la conversion
  nbrBits : Integer; // nombre de bits actuellement dans vaToDec (maximum 14 + 6)
  charCode: Integer; // code du caractère dans la table Unicode
  quitLoop: Boolean; // quitter la boucle oui / non
begin
  Result   := '';
  nbrBits  := 0;
  valToDec := 0;
  quitLoop := False;

  // parcours des caractères
  for i := 1 to Length(s) do
  begin
    charPos  := Pos(s[i], tabChar) - 1;
    nbrBits  := nbrBits + 6;
    valToDec := (valToDec shl 6) + charPos;

    // cas des derniers bits trop long ( signe = )
    if (i + 1 <= Length(s)) and (s[i+1] = '=') then
    begin
      valToDec := valToDec shr 2;
      nbrBits := nbrBits - 2;

      if (i + 2 <= Length(s)) and (s[i+2] = '=') then
      begin
        valToDec := valToDec shr 2;
        nbrBits := nbrBits - 2;
      end;

      quitLoop := True;
    end;

    // traitement des bits dès qu'un groupe de 16 est possible
    if (nbrBits - 16) >= 0 then
    begin
      nbrBits  := nbrBits - 16;
      charCode := valToDec shr nbrBits;
      valToDec := valToDec - (charCode shl nbrBits);
      Result   := Result + Char(charCode);
    end;

    // quitter la boucle en ignorant les autres caractères ( ignorer les = )
    if quitLoop then
      Break;
  end;

  // vérification
  if nbrBits > 0 then
    Result:= '';
end;

end.

Conclusion :


Pour le détails du fonctionnement du codage en base64, je vous invite à aller sur http://fr.wikipedia.org/wiki/Base64

A voir également

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.