mirror of
https://gitlab.com/freepascal.org/fpc/source.git
synced 2025-12-03 13:17:12 +01:00
* Fixes and new examples from Sebastian Guenther
This commit is contained in:
parent
2e34ee62f3
commit
62678390c1
@ -81,7 +81,7 @@ destructor TBase64EncodingStream.Destroy;
|
|||||||
var
|
var
|
||||||
WriteBuf: array[0..3] of Char;
|
WriteBuf: array[0..3] of Char;
|
||||||
begin
|
begin
|
||||||
// Fill output to multiple of 3
|
// Fill output to multiple of 4
|
||||||
case (TotalBytesProcessed mod 3) of
|
case (TotalBytesProcessed mod 3) of
|
||||||
1: begin
|
1: begin
|
||||||
WriteBuf[0] := EncodingTable[Buf[0] shr 2];
|
WriteBuf[0] := EncodingTable[Buf[0] shr 2];
|
||||||
@ -109,19 +109,18 @@ end;
|
|||||||
function TBase64EncodingStream.Write(const Buffer; Count: Longint): Longint;
|
function TBase64EncodingStream.Write(const Buffer; Count: Longint): Longint;
|
||||||
var
|
var
|
||||||
ReadNow: LongInt;
|
ReadNow: LongInt;
|
||||||
p: PChar;
|
p: Pointer;
|
||||||
WriteBuf: array[0..3] of Char;
|
WriteBuf: array[0..3] of Char;
|
||||||
begin
|
begin
|
||||||
Inc(TotalBytesProcessed, Count);
|
Inc(TotalBytesProcessed, Count);
|
||||||
Result := Count;
|
Result := Count;
|
||||||
|
|
||||||
p := PChar(Buffer);
|
p := @Buffer;
|
||||||
while count > 0 do begin
|
while count > 0 do begin
|
||||||
// Fetch data into the Buffer
|
// Fetch data into the Buffer
|
||||||
ReadNow := 3 - BufSize;
|
ReadNow := 3 - BufSize;
|
||||||
if ReadNow > Count then break; // Not enough data available
|
if ReadNow > Count then break; // Not enough data available
|
||||||
|
Move(p^, Buf[BufSize], ReadNow);
|
||||||
Move(p, Buf[BufSize], ReadNow);
|
|
||||||
Inc(p, ReadNow);
|
Inc(p, ReadNow);
|
||||||
Dec(Count, ReadNow);
|
Dec(Count, ReadNow);
|
||||||
|
|
||||||
@ -134,7 +133,7 @@ begin
|
|||||||
Inc(BytesWritten, 4);
|
Inc(BytesWritten, 4);
|
||||||
BufSize := 0;
|
BufSize := 0;
|
||||||
end;
|
end;
|
||||||
Move(p, Buf[BufSize], count);
|
Move(p^, Buf[BufSize], count);
|
||||||
Inc(BufSize, count);
|
Inc(BufSize, count);
|
||||||
end;
|
end;
|
||||||
|
|
||||||
@ -173,7 +172,6 @@ begin
|
|||||||
if endbytes[0] = '=' then
|
if endbytes[0] = '=' then
|
||||||
Dec(DataLen);
|
Dec(DataLen);
|
||||||
end;
|
end;
|
||||||
// WriteLn('DataLen = ', DataLen);
|
|
||||||
end;
|
end;
|
||||||
|
|
||||||
function TBase64DecodingStream.Read(var Buffer; Count: Longint): Longint;
|
function TBase64DecodingStream.Read(var Buffer; Count: Longint): Longint;
|
||||||
@ -211,11 +209,9 @@ begin
|
|||||||
end;
|
end;
|
||||||
end;
|
end;
|
||||||
end;
|
end;
|
||||||
// WriteLn('ReadBuf: ', ReadBuf[0], ' ', ReadBuf[1], ' ', ReadBuf[2], ' ', ReadBuf[3]);
|
|
||||||
Buf[0] := ReadBuf[0] shl 2 or ReadBuf[1] shr 4;
|
Buf[0] := ReadBuf[0] shl 2 or ReadBuf[1] shr 4;
|
||||||
Buf[1] := (ReadBuf[1] and 15) shl 4 or ReadBuf[2] shr 2;
|
Buf[1] := (ReadBuf[1] and 15) shl 4 or ReadBuf[2] shr 2;
|
||||||
Buf[2] := (ReadBuf[2] and 3) shl 6 or ReadBuf[3];
|
Buf[2] := (ReadBuf[2] and 3) shl 6 or ReadBuf[3];
|
||||||
// WriteLn('Gelesen: ', Buf[0], ' ', Buf[1], ' ', Buf[2]);
|
|
||||||
end;
|
end;
|
||||||
|
|
||||||
p[0] := Chr(Buf[BufPos]);
|
p[0] := Chr(Buf[BufPos]);
|
||||||
@ -250,7 +246,10 @@ end.
|
|||||||
|
|
||||||
{
|
{
|
||||||
$Log$
|
$Log$
|
||||||
Revision 1.1 1999-08-03 17:02:38 michael
|
Revision 1.2 1999-08-09 16:12:28 michael
|
||||||
|
* Fixes and new examples from Sebastian Guenther
|
||||||
|
|
||||||
|
Revision 1.1 1999/08/03 17:02:38 michael
|
||||||
* Base64 en/de cdeing streams added
|
* Base64 en/de cdeing streams added
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
@ -36,7 +36,8 @@ NEEDOPT=-S2
|
|||||||
|
|
||||||
UNITOBJECTS=
|
UNITOBJECTS=
|
||||||
EXEOBJECTS=stringl dparser fstream mstream list threads testrtf\
|
EXEOBJECTS=stringl dparser fstream mstream list threads testrtf\
|
||||||
cfgtest testz testz2 xmldump htdump testcgi tidea b64test
|
cfgtest testz testz2 xmldump htdump testcgi tidea\
|
||||||
|
b64test b64test2 b64enc b64dec
|
||||||
|
|
||||||
|
|
||||||
#####################################################################
|
#####################################################################
|
||||||
@ -113,7 +114,10 @@ endif
|
|||||||
|
|
||||||
#
|
#
|
||||||
# $Log$
|
# $Log$
|
||||||
# Revision 1.10 1999-08-03 17:02:36 michael
|
# Revision 1.11 1999-08-09 16:12:26 michael
|
||||||
|
# * Fixes and new examples from Sebastian Guenther
|
||||||
|
#
|
||||||
|
# Revision 1.10 1999/08/03 17:02:36 michael
|
||||||
# * Base64 en/de cdeing streams added
|
# * Base64 en/de cdeing streams added
|
||||||
#
|
#
|
||||||
# Revision 1.9 1999/07/25 14:30:39 michael
|
# Revision 1.9 1999/07/25 14:30:39 michael
|
||||||
|
|||||||
@ -29,3 +29,6 @@ htdump.pp htdump dumps XL IDL definition as ObjectPascal classes (MVC)
|
|||||||
testcgi.pp test program for ezcgi class (MH)
|
testcgi.pp test program for ezcgi class (MH)
|
||||||
tidea.pp test program for IDEA encryption/decryption streams (MVC)
|
tidea.pp test program for IDEA encryption/decryption streams (MVC)
|
||||||
b64test.pp test program for base64 encoding streams (SG)
|
b64test.pp test program for base64 encoding streams (SG)
|
||||||
|
b64test2.pp test program for base64 encoding streams (SG)
|
||||||
|
b64enc.pp base64-encodes StdIn to StdOut (SG)
|
||||||
|
b64dec.pp base64-decodes file given as 1st argument to StdOut (SG)
|
||||||
37
fcl/tests/b64dec.pp
Normal file
37
fcl/tests/b64dec.pp
Normal file
@ -0,0 +1,37 @@
|
|||||||
|
// $Id$
|
||||||
|
|
||||||
|
// base64-decodes a file (argument #1) and writes the output to StdOut
|
||||||
|
// (c) 1999 Sebastian Guenther
|
||||||
|
|
||||||
|
{$MODE objfpc}
|
||||||
|
|
||||||
|
program b64dec;
|
||||||
|
uses classes, base64, sysutils;
|
||||||
|
var
|
||||||
|
b64decoder: TBase64DecodingStream;
|
||||||
|
InputStream: TStream;
|
||||||
|
IsEnd: Boolean;
|
||||||
|
begin
|
||||||
|
|
||||||
|
InputStream := TFileStream.Create(ParamStr(1), fmOpenRead);
|
||||||
|
|
||||||
|
b64decoder := TBase64DecodingStream.Create(InputStream);
|
||||||
|
|
||||||
|
while not IsEnd do
|
||||||
|
try
|
||||||
|
Write(Chr(b64decoder.ReadByte));
|
||||||
|
except
|
||||||
|
on e: EStreamError do IsEnd := True;
|
||||||
|
end;
|
||||||
|
|
||||||
|
b64decoder.Free;
|
||||||
|
InputStream.Free;
|
||||||
|
end.
|
||||||
|
|
||||||
|
|
||||||
|
{
|
||||||
|
$Log$
|
||||||
|
Revision 1.1 1999-08-09 16:12:26 michael
|
||||||
|
* Fixes and new examples from Sebastian Guenther
|
||||||
|
|
||||||
|
}
|
||||||
39
fcl/tests/b64enc.pp
Normal file
39
fcl/tests/b64enc.pp
Normal file
@ -0,0 +1,39 @@
|
|||||||
|
// $Id$
|
||||||
|
|
||||||
|
// base64-encodes data from StdIn and writes the output to StdOut
|
||||||
|
// (c) 1999 Sebastian Guenther
|
||||||
|
|
||||||
|
{$MODE objfpc}
|
||||||
|
|
||||||
|
program b64enc;
|
||||||
|
uses classes, base64, sysutils;
|
||||||
|
var
|
||||||
|
b64encoder: TBase64EncodingStream;
|
||||||
|
InputStream, OutputStream: TStream;
|
||||||
|
IsEnd: Boolean;
|
||||||
|
begin
|
||||||
|
|
||||||
|
InputStream := THandleStream.Create(StdInputHandle);
|
||||||
|
OutputStream := THandleStream.Create(StdOutputHandle);
|
||||||
|
|
||||||
|
b64encoder := TBase64EncodingStream.Create(OutputStream);
|
||||||
|
|
||||||
|
while not IsEnd do
|
||||||
|
try
|
||||||
|
b64encoder.WriteByte(InputStream.ReadByte);
|
||||||
|
except
|
||||||
|
on e: EStreamError do IsEnd := True;
|
||||||
|
end;
|
||||||
|
|
||||||
|
b64encoder.Free;
|
||||||
|
InputStream.Free;
|
||||||
|
OutputStream.Free;
|
||||||
|
end.
|
||||||
|
|
||||||
|
|
||||||
|
{
|
||||||
|
$Log$
|
||||||
|
Revision 1.1 1999-08-09 16:12:26 michael
|
||||||
|
* Fixes and new examples from Sebastian Guenther
|
||||||
|
|
||||||
|
}
|
||||||
37
fcl/tests/b64test2.pp
Normal file
37
fcl/tests/b64test2.pp
Normal file
@ -0,0 +1,37 @@
|
|||||||
|
{$MODE objfpc}
|
||||||
|
|
||||||
|
program b64test;
|
||||||
|
uses classes, base64, sysutils;
|
||||||
|
var
|
||||||
|
b64encoder: TBase64EncodingStream;
|
||||||
|
b64decoder: TBase64DecodingStream;
|
||||||
|
BaseStream: TStream;
|
||||||
|
i, j: Integer;
|
||||||
|
buf: array[1..23] of Char;
|
||||||
|
begin
|
||||||
|
BaseStream := TMemoryStream.Create;
|
||||||
|
|
||||||
|
WriteLn('Encoded Size / Decoded Size / Data:');
|
||||||
|
|
||||||
|
for i := 1 to 22 do begin
|
||||||
|
BaseStream.Position := 0;
|
||||||
|
|
||||||
|
b64encoder := TBase64EncodingStream.Create(BaseStream);
|
||||||
|
for j := 1 to i do
|
||||||
|
buf[j] := Chr(i - j + 65);
|
||||||
|
b64encoder.Write(buf, i);
|
||||||
|
Write(b64encoder.Size: 2, ' ');
|
||||||
|
b64encoder.Free;
|
||||||
|
|
||||||
|
BaseStream.Position := 0;
|
||||||
|
|
||||||
|
b64decoder := TBase64DecodingStream.Create(BaseStream);
|
||||||
|
Write(b64decoder.Size: 2, ' ');
|
||||||
|
b64decoder.Read(buf, i);
|
||||||
|
buf[i + 1] := #0;
|
||||||
|
WriteLn(buf);
|
||||||
|
b64decoder.Free;
|
||||||
|
end;
|
||||||
|
|
||||||
|
BaseStream.Free;
|
||||||
|
end.
|
||||||
Loading…
Reference in New Issue
Block a user