![]() |
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:
Ergebnis hier "BZ4B6PZ7EEVO6===" erwartet habe ich "BZ4B7BUYEEVO6==="
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; Kann mir da mal jemand auf die Sprünge helfen ? |
AW: Base32 Implementation
.. was ist, wenn Du ansiSrings verwendest?
Delphi-Quellcode:
.. und hat Delphi nicht ein Base32 Encoding enthalten?
function Base32Encode(source: AnsiString): AnsiString;
Grüße Klaus |
AW: Base32 Implementation
Schon ausprobiert, gleiches Ergebnis.
Base32 in Delphi selbst finde ich leider ebenfalls nicht. |
AW: Base32 Implementation
Wenn Du das "DngfhpghKu8="
![]() 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 |
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===" |
AW: Base32 Implementation
... und base64decode("DngfhpghKu8=") zeigt das gleiche Ergebnis wie TIdDecoderMIME.DecodeString("DngfhpghKu8=")?
Grüße Klaus |
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.
|
AW: Base32 Implementation
Zitat:
Irgendwas ist mit der Darstellung der beiden Strings nicht in Ordnung? Gruß K-H |
AW: Base32 Implementation
Delphi-Quellcode:
Kommt noch verwirrenderes Zeug bei raus.
tmp := 'DngfhpghKu8=';
aBytes := TBytes(TIdDECoderMime.DecodeBytes(tmp)); result := Base32Encode(aBytes, Length(aBytes)); // Result = '2DS5GALYRLGAC===' 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:
|
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 07:33 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz