Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Algorithmen, Datenstrukturen und Klassendesign (https://www.delphipraxis.net/78-algorithmen-datenstrukturen-und-klassendesign/)
-   -   Base32 Implementation (https://www.delphipraxis.net/191675-base32-implementation.html)

hhcm 9. Feb 2017 09:41

Base32 Implementation
 
Hallo zusammen,

ich stehe gerade ein wenig auf dem Schlauch. In einer JAVA Anwendung wird ein Base64 String in einen Base32 String konvertiert und ich komme in Delphi einfach nicht auf das gleiche Ergebnis.

In JAVA wird "DngfhpghKu8=" zu "BZ4B7BUYEEVO6==="
Diverse Online-Tools zeigen mir das gleiche Ergebnis.

In Delphi komme ich mit Diversen im Netz gefundenen Funktionen nicht mal annähernd an das Egebnis.
Die Funktion die dem ganzen nahe kommt ist folgende.

Delphi-Quellcode:
const
  base32chars = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ234567';

function Base32Encode(source: string): string;
var
  i: integer;
  nr: int64;
begin
  result := '';
  while length(source) > 0 do
  begin
    nr := 0;
    for i := 1 to 5 do
    begin
      nr := (nr shl 8);
      if length(source)>=i then
        nr := nr + byte(source[i]);
    end;
    for i := 7 downto 0 do
      if ((length(source)<2) and (i<6)) or
         ((length(source)<3) and (i<4)) or
         ((length(source)<4) and (i<3)) or
         ((length(source)<5) and (i<1)) then
      result := result + '='
    else
      result := result + base32chars[((nr shr (i*5)) and $1F)+1];
    delete(source, 1, 5);
  end;
end;
Ergebnis hier "BZ4B6PZ7EEVO6===" erwartet habe ich "BZ4B7BUYEEVO6==="

Kann mir da mal jemand auf die Sprünge helfen ?

Klaus01 9. Feb 2017 09:46

AW: Base32 Implementation
 
.. was ist, wenn Du ansiSrings verwendest?
Delphi-Quellcode:
function Base32Encode(source: AnsiString): AnsiString;
.. und hat Delphi nicht ein Base32 Encoding enthalten?

Grüße
Klaus

hhcm 9. Feb 2017 09:48

AW: Base32 Implementation
 
Schon ausprobiert, gleiches Ergebnis.
Base32 in Delphi selbst finde ich leider ebenfalls nicht.

Klaus01 9. Feb 2017 10:13

AW: Base32 Implementation
 
Wenn Du das "DngfhpghKu8="hier codierst/encodest
kommt "IRXGOZTIOBTWQS3VHA6QU===" heraus.
Das bekommt man auch mt Deiner Routine.

Wenn Du base64 nach base32 umkodieren willst, muss dann nicht erst
base64 nach Klartext und dann der Klartext nach base32 gewandelt werden.

Grüße
Klaus

hhcm 9. Feb 2017 10:27

AW: Base32 Implementation
 
Das mache ich ja. (Sorry vergessen zu erwähnen)

In Java

base32encode(base64decode("DngfhpghKu8=")) = "BZ4B7BUYEEVO6==="

In Delphi

base32encode(TIdDecoderMIME.DecodeString("Dngfhpgh Ku8=")) = "BZ4B6PZ7EEVO6==="

Klaus01 9. Feb 2017 10:29

AW: Base32 Implementation
 
... und base64decode("DngfhpghKu8=") zeigt das gleiche Ergebnis wie TIdDecoderMIME.DecodeString("DngfhpghKu8=")?

Grüße
Klaus

Uwe Raabe 9. Feb 2017 10:32

AW: Base32 Implementation
 
Der decodierte Base64 Inhalt ist in der Regel nicht konsistent als String darstellbar. Ich würde das als TBytes decoden und den Base32-Encode auch auf TBytes loslassen.

p80286 9. Feb 2017 10:36

AW: Base32 Implementation
 
Zitat:

Zitat von hhcm (Beitrag 1361148)
Das mache ich ja. (Sorry vergessen zu erwähnen)

In Java

base32encode(base64decode("DngfhpghKu8=")) = "BZ4B7BUYEEVO6==="

In Delphi

base32encode(TIdDecoderMIME.DecodeString("Dngfhpgh Ku8=")) = "BZ4B6PZ7EEVO6==="

da stimmt doch was nicht?
Irgendwas ist mit der Darstellung der beiden Strings nicht in Ordnung?

Gruß
K-H

hhcm 9. Feb 2017 10:42

AW: Base32 Implementation
 
Delphi-Quellcode:
tmp := 'DngfhpghKu8=';
aBytes := TBytes(TIdDECoderMime.DecodeBytes(tmp));

result := Base32Encode(aBytes, Length(aBytes));
// Result = '2DS5GALYRLGAC==='
Kommt noch verwirrenderes Zeug bei raus.

Die Byte Implementation ist

Delphi-Quellcode:
function Base32Encode(const buf; len: integer): string;
var
  i: integer;
  nr: int64;
  arr: array of byte;
begin
  result := '';
  SetLength(arr, len);
  Move(buf, arr[0], len);
  while length(arr) > 0 do
  begin
    nr := 0;
    for i := 1 to 5 do
    begin
      nr := (nr shl 8);
      if length(arr)>=i then
        nr := nr + byte(arr[i-1]);
    end;
    for i := 7 downto 0 do
      if ((length(arr)<2) and (i<6)) or
         ((length(arr)<3) and (i<4)) or
         ((length(arr)<4) and (i<3)) or
         ((length(arr)<5) and (i<1)) then
      result := result + '='
    else
      result := result + base32chars[((nr shr (i*5)) and $1F)+1];
    if length(arr)>5 then
    begin
      move(arr[5], arr[0], length(arr)-5);
      setlength(arr, length(arr)-5);
    end
    else
      setlength(arr, 0);
  end;
end;
Zitat:

... und base64decode("DngfhpghKu8=") zeigt das gleiche Ergebnis wie TIdDecoderMIME.DecodeString("Dngfhpgh Ku8=")?
Wie Uwe schon sagte, das ist nicht vernünftig darstellbar.

Uwe Raabe 9. Feb 2017 10:43

AW: Base32 Implementation
 
Ja, das liegt wohl am Indy-Decoding. So funktioniert es:
Delphi-Quellcode:
uses
  System.SysUtils,
  System.NetEncoding;

const
  base32chars = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ234567';

function Base32Encode(source: TBytes): string;
var
  i: integer;
  L: Integer;
  nr: int64;
  offset: Integer;
begin
  result := '';
  offset := 0;
  L := length(source);
  while L > 0 do
  begin
    nr := 0;
    for i := 0 to 4 do
    begin
      nr := (nr shl 8);
      if i < L then begin
        nr := nr + source[offset + i];
      end;
    end;
    for i := 7 downto 0 do
      if ((L<2) and (i<6)) or
         ((L<3) and (i<4)) or
         ((L<4) and (i<3)) or
         ((L<5) and (i<1)) then
      result := result + '='
    else
      result := result + base32chars[((nr shr (i*5)) and $1F)+1];
    Inc(Offset, 5);
    Dec(L, Offset);
  end;
end;

procedure Main();
begin
  Assert(Base32Encode(TNetEncoding.Base64.DecodeStringToBytes('DngfhpghKu8='))='BZ4B7BUYEEVO6===');
end;


Alle Zeitangaben in WEZ +1. Es ist jetzt 19:16 Uhr.
Seite 1 von 2  1 2      

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz