mirror of
https://gitlab.com/freepascal.org/fpc/source.git
synced 2025-12-03 04:47:31 +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
|
||||
WriteBuf: array[0..3] of Char;
|
||||
begin
|
||||
// Fill output to multiple of 3
|
||||
// Fill output to multiple of 4
|
||||
case (TotalBytesProcessed mod 3) of
|
||||
1: begin
|
||||
WriteBuf[0] := EncodingTable[Buf[0] shr 2];
|
||||
@ -109,19 +109,18 @@ end;
|
||||
function TBase64EncodingStream.Write(const Buffer; Count: Longint): Longint;
|
||||
var
|
||||
ReadNow: LongInt;
|
||||
p: PChar;
|
||||
p: Pointer;
|
||||
WriteBuf: array[0..3] of Char;
|
||||
begin
|
||||
Inc(TotalBytesProcessed, Count);
|
||||
Result := Count;
|
||||
|
||||
p := PChar(Buffer);
|
||||
p := @Buffer;
|
||||
while count > 0 do begin
|
||||
// Fetch data into the Buffer
|
||||
ReadNow := 3 - BufSize;
|
||||
if ReadNow > Count then break; // Not enough data available
|
||||
|
||||
Move(p, Buf[BufSize], ReadNow);
|
||||
Move(p^, Buf[BufSize], ReadNow);
|
||||
Inc(p, ReadNow);
|
||||
Dec(Count, ReadNow);
|
||||
|
||||
@ -134,7 +133,7 @@ begin
|
||||
Inc(BytesWritten, 4);
|
||||
BufSize := 0;
|
||||
end;
|
||||
Move(p, Buf[BufSize], count);
|
||||
Move(p^, Buf[BufSize], count);
|
||||
Inc(BufSize, count);
|
||||
end;
|
||||
|
||||
@ -173,7 +172,6 @@ begin
|
||||
if endbytes[0] = '=' then
|
||||
Dec(DataLen);
|
||||
end;
|
||||
// WriteLn('DataLen = ', DataLen);
|
||||
end;
|
||||
|
||||
function TBase64DecodingStream.Read(var Buffer; Count: Longint): Longint;
|
||||
@ -211,11 +209,9 @@ begin
|
||||
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[1] := (ReadBuf[1] and 15) shl 4 or ReadBuf[2] shr 2;
|
||||
Buf[2] := (ReadBuf[2] and 3) shl 6 or ReadBuf[3];
|
||||
// WriteLn('Gelesen: ', Buf[0], ' ', Buf[1], ' ', Buf[2]);
|
||||
end;
|
||||
|
||||
p[0] := Chr(Buf[BufPos]);
|
||||
@ -250,7 +246,10 @@ end.
|
||||
|
||||
{
|
||||
$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
|
||||
|
||||
}
|
||||
|
||||
@ -36,7 +36,8 @@ NEEDOPT=-S2
|
||||
|
||||
UNITOBJECTS=
|
||||
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$
|
||||
# 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
|
||||
#
|
||||
# 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)
|
||||
tidea.pp test program for IDEA encryption/decryption streams (MVC)
|
||||
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