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;
Da muss man erst mal drauf kommen. Danke.
Bei kurzen Base64 Kodierten Strings funktioniert das hervorragend.
Bei größeren irgendwie nicht mehr.
"Ubz6l2+TFt80EWAf6CTr/Xocpgn9UhOhSvlGMqQsML1LxieEE7bWqB5Y6HAwaC0NSA50swr GHxKs/UOGPS1SJA=="
sollte
"KG6PVF3PSMLN6NARMAP6QJHL7V5BZJQJ7VJBHIKK7FDDFJBMG C6UXRRHQQJ3NVVIDZMOQ4BQNAWQ2SAOOSZQVRQ7CKWP2Q4GHUW VEJA="
werden.
Bricht aber ab. Sollte das nicht wie folgt sein?
Delphi-Quellcode:
Dec(L, offset);
// wird zu
Dec(L, 5);