AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Base32 Implementation

Ein Thema von hhcm · begonnen am 9. Feb 2017 · letzter Beitrag vom 9. Feb 2017
Antwort Antwort
Seite 1 von 2  1 2      
hhcm

Registriert seit: 12. Feb 2006
Ort: Wegberg
310 Beiträge
 
Delphi 11 Alexandria
 
#1

Base32 Implementation

  Alt 9. Feb 2017, 10:41
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 ?
Chris
  Mit Zitat antworten Zitat
Klaus01

Registriert seit: 30. Nov 2005
Ort: München
5.771 Beiträge
 
Delphi 10.4 Sydney
 
#2

AW: Base32 Implementation

  Alt 9. Feb 2017, 10:46
.. was ist, wenn Du ansiSrings verwendest?
function Base32Encode(source: AnsiString): AnsiString; .. und hat Delphi nicht ein Base32 Encoding enthalten?

Grüße
Klaus
Klaus
  Mit Zitat antworten Zitat
hhcm

Registriert seit: 12. Feb 2006
Ort: Wegberg
310 Beiträge
 
Delphi 11 Alexandria
 
#3

AW: Base32 Implementation

  Alt 9. Feb 2017, 10:48
Schon ausprobiert, gleiches Ergebnis.
Base32 in Delphi selbst finde ich leider ebenfalls nicht.
Chris
  Mit Zitat antworten Zitat
Klaus01

Registriert seit: 30. Nov 2005
Ort: München
5.771 Beiträge
 
Delphi 10.4 Sydney
 
#4

AW: Base32 Implementation

  Alt 9. Feb 2017, 11:13
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
Klaus
  Mit Zitat antworten Zitat
hhcm

Registriert seit: 12. Feb 2006
Ort: Wegberg
310 Beiträge
 
Delphi 11 Alexandria
 
#5

AW: Base32 Implementation

  Alt 9. Feb 2017, 11:27
Das mache ich ja. (Sorry vergessen zu erwähnen)

In Java

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

In Delphi

base32encode(TIdDecoderMIME.DecodeString("Dngfhpgh Ku8=")) = "BZ4B6PZ7EEVO6==="
Chris
  Mit Zitat antworten Zitat
Klaus01

Registriert seit: 30. Nov 2005
Ort: München
5.771 Beiträge
 
Delphi 10.4 Sydney
 
#6

AW: Base32 Implementation

  Alt 9. Feb 2017, 11:29
... und base64decode("DngfhpghKu8=") zeigt das gleiche Ergebnis wie TIdDecoderMIME.DecodeString("DngfhpghKu8=")?

Grüße
Klaus
Klaus

Geändert von Klaus01 ( 9. Feb 2017 um 11:43 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von Uwe Raabe
Uwe Raabe

Registriert seit: 20. Jan 2006
Ort: Lübbecke
11.475 Beiträge
 
Delphi 12 Athens
 
#7

AW: Base32 Implementation

  Alt 9. Feb 2017, 11:32
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.
Uwe Raabe
Certified Delphi Master Developer
Embarcadero MVP
Blog: The Art of Delphi Programming
  Mit Zitat antworten Zitat
Benutzerbild von p80286
p80286

Registriert seit: 28. Apr 2008
Ort: Stolberg (Rhl)
6.659 Beiträge
 
FreePascal / Lazarus
 
#8

AW: Base32 Implementation

  Alt 9. Feb 2017, 11:36
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
Programme gehorchen nicht Deinen Absichten sondern Deinen Anweisungen
R.E.D retired error detector
  Mit Zitat antworten Zitat
hhcm

Registriert seit: 12. Feb 2006
Ort: Wegberg
310 Beiträge
 
Delphi 11 Alexandria
 
#9

AW: Base32 Implementation

  Alt 9. Feb 2017, 11:42
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.
Chris
  Mit Zitat antworten Zitat
Benutzerbild von Uwe Raabe
Uwe Raabe

Registriert seit: 20. Jan 2006
Ort: Lübbecke
11.475 Beiträge
 
Delphi 12 Athens
 
#10

AW: Base32 Implementation

  Alt 9. Feb 2017, 11:43
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;
Uwe Raabe
Certified Delphi Master Developer
Embarcadero MVP
Blog: The Art of Delphi Programming
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2      


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 13:12 Uhr.
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