TOBASE64 String Konvertierung

ERICH KATH
Benutzer
Avatar
Gender: n/a
Location: 61206 Wöllstadt
Homepage: ct-gmbh.de
Posts: 29
Registered: 04 / 2005
Subject:

TOBASE64 String Konvertierung

 · 
Posted: 10.01.2012 - 14:37  ·  #1
Hallo,

ich muss Benutzername und Password für einen Serverzugang in BASE64 umwandeln. Im E-Lab Compiler habe ich nichts dazu gefunden. Wer kann helfen ?

Online geht's hier:

Online Umwandlung

Beispiel in Pascal:

uses Classes, base64;

var
DecodedStream: TStringStream;
EncodedStream: TStringStream;
Encoder: TBase64EncodingStream;
Output: string;
begin
DecodedStream := TStringStream.Create('Hello World!');
EncodedStream := TStringStream.Create('');
Encoder := TBase64EncodingStream.Create(EncodedStream);
Encoder.CopyFrom(DecodedStream, DecodedStream.Size);

Output := EncodedStream.DataString;
{ Outputs 'SGVsbG8gV29ybGQh' }
WriteLn(Output);

DecodedStream.Free;
EncodedStream.Free;
Encoder.Free;
end.

Gruß

ERICH KATH
Gunter
Administrator
Avatar
Gender:
Location: Frankfurt Main / Germany
Posts: 1697
Registered: 02 / 2003
Subject:

Re: TOBASE64 String Konvertierung

 · 
Posted: 10.01.2012 - 16:52  ·  #2
miparo
Administrator
Avatar
Gender:
Location: Germany
Age: 58
Posts: 959
Registered: 09 / 2007
Subject:

Re: TOBASE64 String Konvertierung

 · 
Posted: 10.01.2012 - 18:57  ·  #3
Hallo Erich,
ich habe das mal für meinen Email Client gemacht.

Code

const
  B64              : String              = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/';

Function Encode64(S : Pointer; sLen : Word; Dest : Pointer; rLen : Word) : Word;
var
  i, Ret           : Word;
  a                : Byte;
  x                : Word;
  b                : Word;

Begin
  Ret:= (((sLen + 2) div 3) * 4);
  if (sLen = 0) or (Ret > rLen) then
    Return(0);
  endif;

  i := 0;
  a := 0;
  b := 0;
  for i := 1 to sLen do
    x := Ord(s^); Inc(s);
    b := b * 256 + x;
    a := a + 8;
    while a >= 6 do
      a := a - 6;
      x := b div (1 shl a);
      b := b mod (1 shl a);
      Dest^:= Dest^ + B64[x + 1]; Inc(Dest);
    endwhile;
  endfor;
  if a > 0 then
    x := b shl (6 - a);
    Dest^:= Dest^ + B64[x + 1]; Inc(Dest);
    case (sLen mod 3) of
      1 : Dest^:= Byte('='); Inc(Dest);
          Dest^:= Byte('=');
        |
      2 : Dest^:= Byte('=');
        |
    endcase;
  endif;
  Return(Ret);
end;
//-----------------------------------------------------------------------------
Function Decode64(S : Pointer; sLen : Word; Dest : Pointer; rLen : Word) : Word;
var
  i, Ret           : Word;
  a                : Byte;
  x                : Integer;
  b                : Word;
Begin
  a := 0;
  b := 0;
  Ret:= 0;
  for i := 1 to sLen do
    x := Integer(Pos(Char(s^), B64)) - 1; Inc(s);
    if x >= 0 then
      b := b * 64 + x;
      a := a + 6;
      if a > = 8 then
        a := a - 8;
        x := Integer(b shr a);
        b := b mod (1 shl a);
        x := x mod 256;
        Dest^ := Dest^ + Char(x);
        Inc(Dest); Inc(Ret);
      endif;
    else
      Return(Ret);
    endif;
  endfor;
  Return(Ret);   // '=' ???????
end;
ERICH KATH
Benutzer
Avatar
Gender: n/a
Location: 61206 Wöllstadt
Homepage: ct-gmbh.de
Posts: 29
Registered: 04 / 2005
Subject:

Danke!

 · 
Posted: 11.01.2012 - 09:09  ·  #4
Allerbesten Dank! Ich kann nur begrenzt programmieren. Aber damit komme ich jetzt gut weiter. Meine Kernkompetenz liegt woanders...

Gruß

ERICH
miparo
Administrator
Avatar
Gender:
Location: Germany
Age: 58
Posts: 959
Registered: 09 / 2007
Subject:

Re: TOBASE64 String Konvertierung

 · 
Posted: 11.01.2012 - 23:31  ·  #5
Hallo Erich,
macht nichts.
Die meisten Programmierer sind Bäcker,Autolackierer oder kommen aus einem Elektronikbereich.
Und auch die mit einen Ing. davor können auch nicht immer mehr als Du. :D
Die wenigsten sind gelernte Programmierer hier.

Gruß
miparo
ERICH KATH
Benutzer
Avatar
Gender: n/a
Location: 61206 Wöllstadt
Homepage: ct-gmbh.de
Posts: 29
Registered: 04 / 2005
Subject:

Re: TOBASE64 String Konvertierung

 · 
Posted: 24.01.2012 - 10:01  ·  #6
Hallo Miparo,

auch wenn es mir peinlich ist: Ich brauche noch eine mini Hilfestelltung. Bisher habe ich nur mit procedures gearbeitet. Funktionen mit Parameterübergabe sind Neuland. Zur aktuellen Funktion: Ich habe einen String der umgewandelt wereden soll. (Base := 'ABCDEF';) Das Ergebnis soll dann im String BASE64 stehen.

Wie erfolgt der Aufruf der Funktion?

Besten Dank schon im Vorraus!

ERICH
miparo
Administrator
Avatar
Gender:
Location: Germany
Age: 58
Posts: 959
Registered: 09 / 2007
Subject:

Re: TOBASE64 String Konvertierung

 · 
Posted: 24.01.2012 - 11:47  ·  #7
Moin,

Ein Schnipsel von meinem Email Clienten
Code

Var
 UserPass         : string[60];
 Tmp_auth        : string[100];    // store Base64 encoded Userpass     Result ist ca. 25% größer


UserPass:= 'ABCDE';
Len64:= Encode64(@UserPass[1], word(Length(Userpass)), @Tmp_auth[1], SizeOf(Tmp_auth) - 1);
SetLength(Tmp_auth, byte(Len64));

 Writeln(serout, UserPass + '" = ' + Tmp_auth);



Kann man alles auch einfacher schreiben wenn die Funktionen nur für Strings sein sollen.

Gruß
miparo
miparo
Administrator
Avatar
Gender:
Location: Germany
Age: 58
Posts: 959
Registered: 09 / 2007
Subject:

Re: TOBASE64 String Konvertierung

 · 
Posted: 29.06.2013 - 15:09  ·  #8
Leider habe ich mit unseren Forums Doctor gerade einen kleinen Fehler im En/Decode64 endtdeckt, der sich aber nur mehrmaligen Aufrufen zeigte.

Anbei nochmal die korrigierten Routinen:

Code


{ Const Declarations }
const
  B64              : String              = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/';

{--------------------------------------------------------------}
Function Encode64(S : Pointer; sLen : Word; Dest : Pointer; rLen : Word) : Word;
var
  i, Ret           : Word;
  a                : Byte;
  x                : Word;
  b                : Word;

Begin
  FillBlock(Dest,rlen,0);
  Ret:= (((sLen + 2) div 3) * 4);
  if (sLen = 0) or (Ret > rLen) then
    Return(0);
  endif;

  i := 0;
  a := 0;
  b := 0;
  for i := 1 to sLen do
    x := Ord(s^); Inc(s);
    b := (b shl  8) + x;
    a := a + 8;
    while a >= 6 do
      a := a - 6;
      x := b div (1 shl a);
      b := b mod (1 shl a);
      Dest^:= Dest^ + B64[x + 1]; Inc(Dest);
    endwhile;
  endfor;
  if a > 0 then
    x := b shl (6 - a);
    Dest^:= Dest^ + B64[x + 1]; Inc(Dest);
    case (sLen mod 3) of
      1 : Dest^:= Byte('='); Inc(Dest);
          Dest^:= Byte('=');
        |
      2 : Dest^:= Byte('=');
        |
    endcase;
  endif;
  Return(Ret);
end;
//-----------------------------------------------------------------------------
Function Decode64(S : Pointer; sLen : Word; Dest : Pointer; rLen : Word) : Word;
var
  i, Ret           : Word;
  a                : Byte;
  x                : Integer;
  b                : Word;
Begin
  a := 0;
  b := 0;
  Ret:= 0;
  FillBlock(Dest,rlen,0);
  for i := 1 to sLen do
    x := Integer(Pos(Char(s^), B64)) - 1; Inc(s);
    if x >= 0 then
      b := (b shl 6) + x;
      a := a + 6;
      if a > = 8 then
        a := a - 8;
        x := Integer(b shr a);
        b := b mod (1 shl a);
        x := x mod 256;
        Dest^ := Dest^ + Char(x);
        Inc(Dest); Inc(Ret);
      endif;
    else
      Return(Ret);
    endif;
  endfor;
  Return(Ret);
end;
{--------------------------------------------------------------}




// mini TestProg

var
  Len64                 : word;
  UserPass            : string[60];
  Tmp_auth           : string[60];    // store Base64 encoded Userpass     Rsult ist ca. 25% größer

procedure Base64Test;
begin

  Writeln(SerOutC0,'Base64 Test');
  
  UserPass:= 'meineEmail.de';
  Len64:= Encode64(@UserPass[1], word(Length(UserPass)), @Tmp_auth[1], SizeOf(Tmp_auth) - 1);
  SetLength(Tmp_auth,byte(Len64));   // wichtig !!!
  Writeln(SerOutC0,'Encode :' +Tmp_auth);
  
  
  
  UserPass:= 'MeinPasswort';
  Len64:= Encode64(@UserPass[1], word(Length(UserPass)), @Tmp_auth[1], SizeOf(Tmp_auth) - 1);
  SetLength(Tmp_auth,byte(Len64));
  Writeln(SerOutC0,'Encode PW:' +Tmp_auth);
  
  // and back
  Len64:= Decode64(@Tmp_auth[1], word(length(Tmp_auth)),@UserPass[1], SizeOf(UserPass));
  SetLength(UserPass,byte(Len64));

  Writeln(SerOutC0,'Decode PW: ' +UserPass);
end;


ergibt:

Base64 Test
Encode :bWVpbmVFbWFpbC5kZQ==
Encode PW:TWVpblBhc3N3b3J0
Decode PW: MeinPasswort

Kontrollieren kann man hier: Base64 Online
Selected quotes for multi-quoting:   0

Registered users in this topic

Currently no registered users in this section

The statistic shows who was online during the last 5 minutes. Updated every 90 seconds.
MySQL Queries: 15 · Cache Hits: 14   133   147 · Page-Gen-Time: 0.05233s · Memory Usage: 2 MB · GZIP: on · Viewport: SMXL-HiDPI