Utilisation fonction Base64Encode [Résolu]

Messages postés
97
Date d'inscription
vendredi 19 octobre 2007
Dernière intervention
18 décembre 2013
- 20 oct. 2009 à 10:45 - Dernière réponse :
Messages postés
97
Date d'inscription
vendredi 19 octobre 2007
Dernière intervention
18 décembre 2013
- 20 oct. 2009 à 11:52
Bonjour à tous,

J'ai une fonction qui va me permettre de coder en base64 le contenu d'un fichier source vers un fichier destination avec cette fonction :

function Base64Encode(InBuffer : pointer; InSize : integer; OutBuffer : pointer;
var OutSize : integer) : boolean;

Or, je ne sais pas comment utiliser cette fonction vu que InBuffer et OutBuffer sont des pointer.

J'avais fait quelque chose comme cela :

var
  LoadString : ByteArray;
  SaveBase64 : ByteArray;

begin

  fsSource := TFileStream.Create(fichSource, fmOpenRead or fmShareDenyWrite);
  fsDest   := TFileStream.Create(fichDest,fmCreate);
  try

    InSize  := fsSource.Size;
    OutSize := 0;

    fsSource.ReadBuffer(Pointer(LoadString)^,length(LoadString));

    Base64Encode(@LoadString,InSize,@SaveBase64,OutSize,False);

    fsDest.WriteBuffer(Pointer(SaveBase64)^,length(SaveBase64));

  finally
    FreeAndNil(fsDest);
    FreeAndNil(fsSource);
  end;


Merci de m'aider à résoudre ce problème ;-)
Afficher la suite 

Votre réponse

6 réponses

Meilleure réponse
- 20 oct. 2009 à 10:57
3
Merci
Salut : J'avais une fonction pour encoder en base 64 un fichier

 Function Base64Encode(S1: TStream) : string;
 const
 Code64: string[64]=('ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/');
 var
 Sg,Str: string;
 N, J: Integer;
 B: array[1..3] of Byte;
 const
 LinLen = SizeOf(B)* 20;
 begin
 while S1.Position < S1.Size do
 begin
 N:= 0;
 Sg:= '';
 while (N < LinLen) and (S1.Position < S1.Size) do
 begin
 J:= S1.Size-S1.Position;
 if J > SizeOf(B) then
 J:= SizeOf(B);
 Inc(N, J);
 S1.ReadBuffer(B, J);
 Sg:= Sg+ Code64[(B[1] shr 2)+1];
 Sg:= Sg+ Code64[(B[1] and $03) shl 4 + (B[2] shr 4)+1];
 if J > 1 then Sg:= Sg+ Code64[(B[2] and $0F) shl 2 + (B[3] shr 6)+1]
 else Sg:= Sg+ '=';
 if J > 2 then Sg:= Sg+ Code64[(B[3] and $3F)+1]
 else Sg:= Sg+ '=';
 end;
 Str:=Str+Sg;
 end;
 Result:=Str;
 end;

 Function StringToEnCode64String(Const Source:string):string;
 Var
   S1: TMemoryStream;
 Begin
   S1:=TMemoryStream.create;
   s1.write(Source[1],length(Source));
   s1.position:=0;
   Result:=Base64Encode(s1);
   s1.Free;
 End;

 Function FileToEnCode64String(Const Source:string):string;
 Var
   S1: TFileStream;
 Begin
   If not FileExists(Source) then
   Begin
     Result:='';
     Exit;
   End;
   S1:=TFileStream.create(Source,fmOpenRead);
   Result:=Base64Encode(s1);
   s1.Free;
 End; 


J'avais vu la fonction que tu cites, mais de mémoire elle ne fonctionne pas

Merci Utilisateur anonyme 3

Avec quelques mots c'est encore mieux Ajouter un commentaire

Codes Sources a aidé 89 internautes ce mois-ci

Commenter la réponse de Utilisateur anonyme
Messages postés
97
Date d'inscription
vendredi 19 octobre 2007
Dernière intervention
18 décembre 2013
- 20 oct. 2009 à 11:11
0
Merci
Merci Francky !

Je vais l'essayer de suite.

Au départ, j'utilisai le composant INDY TIdEncoderMIME. Il marche très bien sauf qu'il me rajouter un retour à la ligne tout les 64 octets...
Commenter la réponse de grandyaka54
Messages postés
4229
Date d'inscription
vendredi 23 juillet 2004
Dernière intervention
3 août 2018
- 20 oct. 2009 à 11:13
0
Merci
Salut,

sinon il y a ça à voir ...
j'ai pas testé mais les routines d'encodage et de décodage sont en ASM avec ou sans contrôle de validité et même une version "Fast" ...


[hr]@+Cirec
[hr]
Commenter la réponse de Cirec
Messages postés
97
Date d'inscription
vendredi 19 octobre 2007
Dernière intervention
18 décembre 2013
- 20 oct. 2009 à 11:26
0
Merci
Merci de ton aide Cirec... Je vais utiliser la fonction Base64Encod de Francky qui marche nickel !

Merci à vous deux ;-)
Commenter la réponse de grandyaka54
Messages postés
4229
Date d'inscription
vendredi 23 juillet 2004
Dernière intervention
3 août 2018
- 20 oct. 2009 à 11:45
0
Merci
mais bien sur qu'elle fonctionne parfaitement

Francky ne va pas te filer un bout de code qui ne fonctionne pas ;)

après tout dépend de ce qui veux faire avec .. si tu as besoin que d'encoder un truc c'est bon mais si la vitesse et le contrôle des données sont indispensables alors il faut regarder du coté du lien que je t'ai donné

ps: cette unité a été écrite en remplacement des fonctions Indy jugées trop lentes et pas assez fiables.


[hr]@+Cirec
[hr]
Commenter la réponse de Cirec
Messages postés
97
Date d'inscription
vendredi 19 octobre 2007
Dernière intervention
18 décembre 2013
- 20 oct. 2009 à 11:52
0
Merci
Loin de moi l'idée de récupérer un code qui ne marche pas surtout venant de Francky...

En faite le code de Francky est très bien pour l'utilisation que je vais en faire. Le but est de coder une valeur de hachage (avec un algo sha256) d'un fichier...
Commenter la réponse de grandyaka54

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.