Joachim Mohr Mathematik Musik
//Die Prozeduren wandeln ein Binärstring in einen Textstring und umgekehrt um.
//Kopiere den Text und füge ihn in Deinen Delphi-Editor ein.
//Speichere ihn dann als "umwandlungsprozeduren.pas" ab.
unit umwandlungsprozeduren;
interface
function FileToStr(const pfad: string): string;
procedure StrToFile(const s, pfad: string);
function BinaerStrToTextStr80(const s:string): string;
function TextStr80ToBinaerStr(const s: string): string;
implementation
uses forms,classes, SysUtils, dialogs;
const Trennzeichenkette = 'Binaer zu Text (c) Joachim Mohr b0i1n2t3x4t5&6%7/8';
function copyab(const s: string; const i: integer): string;
begin result := copy(s, i, length(s) - i + 1) end;
function BinaerStrToTextStr(const b:string): string;
const Hub = 40; //Oberhalb #39 (Hochkomma)
var k:integer;
strtext, str01:string;
function NullEinsStrgZuTextstr(const s01:string): string;
//Jeweils 7 Bytes - zum Beispiel - "0011000" wird in ein "lesbares" Byte uebergeführt
var k,j: integer;
a: string;
function NullEinsZuChar(const s:string): char; //zum Beispiel s='0011000';
var j,n: byte;
begin //geht auch kuerzer mit "shr" und "and" ("Maschinennaher Code").
n := 0;
for j := 1 to 7 do
if (j <=length(s)) and (s[j] = '1') then
Case j of 7: n := n + 1;
6: n := n + 2;
5: n := n + 4;
4: n := n + 8;
3: n := n + 16;
2: n := n + 32;
1: n := n + 64;
End; //n maximal 127
if n < Hub then n := n + 128; //So wird ein "unlesbares" Char "lesbar"
result := char(n)
end;
begin
setlength(a,7);
setlength(result,length(s01) div 7+1);
k := 0;
while k <= length(s01) do Begin
for j := 1 to 7 do
if (k + j <=length(s01)) and (s01[k+j] = '1')
then a[j] := '1' else a[j] := '0';
inc(k,7);
result[k div 7] := NullEinsZuChar(a);
End;
end;
begin
setlength(strtext,length(b)); // strtext := stringtest + kostet zu viel Zeit
setlength(str01,length(b)); // Deswegen wird gleich zu Anfang Speicherplatz reserviert
for k := 1 to length(b) do
if ord(b[k]) >= Hub then Begin
strtext[k] := b[k];
str01[k] := '0';
End else Begin
strtext[k] := char(ord(b[k]) + Hub); //Nicht "lesbares" Char wird "lesbar".
str01[k] := '1'; //Das muss man sich merken "0" oder "1"
End;
str01 := NullEinsStrgZuTextstr(str01);
result := Trennzeichenkette + strtext + Trennzeichenkette + str01;
end;
function TextStringToText80str(const s: string): string; //Text80 bestehr aus Zeilen mit 80 Zeichen
var k, n: integer;
begin
setlength(result,1025*length(s) div 1000 + 100); //Je 80 Zeichen + 2 Zeichen = 2,5% mehr
n := 0;
for k := 1 to length(s) do Begin
inc(n);
result[n] := s[k];
if k mod 80 = 0 then BEgin
result[n+1] := #13;
result[n+2] := #10;
inc(n,2);
ENd;
End;
result := copy(result,1,n);
end;
{function TextStringToText80str(const s: string): string; //Text80 bestehr aus Zeilen mit 80 Zeichen
var s0: string;
begin
s0 := s;
result := '';
while s0 <> '' do Begin
if result = '' then result := copy(s0,1,80) else
result := result + #13#10 + copy(s0,1,80);
s0 := copyab(s0,81);
End;
if result = TextStringToText80str0(s) then showmessage('korrekt')
else showmessage('nk');
end;}
function BinaerStrToTextStr80(const s:string): string;
begin
result := TextStringToText80str(BinaerStrToTextStr(s));
end;
{Die Umkehrfunktion: Zwei Delphistrings werden in einen Binaerstring umgewandelt}
function TextStrToBinaerstr0(const t,s01:string): string;
const Hub = 40; //Oberhalb Hochkomma
var k:integer;
s01echtausNullEins: string;
function TextStrZuNullEinsStr(const t:string): string;
var k: integer;
function CharZuNullEins(const c:char): string; //geht auch "maschinennaeher"
var k,n: integer;
begin
setlength(result,7);
n := ord(c);
if n >=128 then n := n - 128; //Das war urspruenglich ein "unlesbares" Char.
for k := 1 to 7 do
Case k of 7: if n and 1 = 1 then result[k] := '1' else result[k] := '0';
6: if n and 2 = 2 then result[k] := '1' else result[k] := '0';
5: if n and 4 = 4 then result[k] := '1' else result[k] := '0';
4: if n and 8 = 8 then result[k] := '1' else result[k] := '0';
3: if n and 16 = 16 then result[k] := '1' else result[k] := '0';
2: if n and 32 = 32 then result[k] := '1' else result[k] := '0';
1: if n and 64 = 64 then result[k] := '1' else result[k] := '0';
End;
end;
begin
result := '';
for k := 1 to length(t) do result := result + CharZuNullEins(t[k]);
end;
begin
s01echtausNullEins := TextStrZuNullEinsstr(s01);
setlength(result,length(t));
for k := 1 to length(t) do Begin
if s01echtausNullEins[k] = '0' then result[k] := t[k] else
result[k] := char(ord(t[k]) - Hub);
End;
end;
function TextStrToBinaerStr(const textstring:string): string;
//textstring ist Trennzeichenkette + t + Trennzeichenkette + s01;
var t,s01: string;
n : integer;
begin
t := copyab(textstring,length(Trennzeichenkette) + 1);
n := pos(Trennzeichenkette,t);
if n = 0 then Begin
showmessage('Fehler: Keine "' + Trennzeichenkette + '"-Datei');
exit;
End;
s01 := copyab(t,n + length(Trennzeichenkette));
t := copy(t,1,n-1);
result := TextStrToBinaerstr0(t,s01);
end;
function Text80strTextString(const s: string): string;
var k, laenge_s, n, n80, n_s: integer;
begin
laenge_s := length(s);
setlength(result,laenge_s); //Weniger. Genau je 80 Zeichen 2 Zeichen weg
n := 0; //Die Stelle in s
n80 := 0; //Jeweils 80 Zeichen werden gelesen, dann wird #13#10 ueberssprungen
n_s := 0; //Die Stelle in result
for k := 1 to length(s) do Begin
inc(n);
inc(n80);
if n <= laenge_s then Begin
inc(n_s);
result[n_s] := s[n];
End;
if n80 = 80 then Begin
inc(n,2);
n80 := 0;
End;
End;
result := copy(result,1,n_s);
end;
{function Text80strTextString(const s: string): string;
var s0: string;
begin
s0 := s;
result := '';
while s0 <> '' do Begin
result := result + copy(s0,1,80); //dahinter #13#10
s0 := copyab(s0,83);
End;
showmessage(inttostr(length(result)) + #13 + inttostr(length(text80strTextString0(s))));
if result = Text80strTextString0(s) then showmessage('korrekt') else
showmessage('nk');
end;}
function TextStr80ToBinaerStr(const s: string): string;
begin
result := TextStrToBinaerStr(Text80strTextString(s));
end;
// Die Lese- und Schreibprozeduren fuer Strings
function FileToStr(const pfad: string): string; //String als Puffer fuer die Bytes
var
F: TStream;
begin
F := TFileStream.Create(pfad, fmOpenRead or fmShareDenyWrite); //uses SysUtils
try
SetLength(result, F.Size);
F.ReadBuffer(PChar(result)^, F.Size);
finally
F.Free;
end;
end;
procedure StrToFile(const s, pfad: string);
var
F: TStream;
begin
F := TFileStream.Create(pfad,fmCreate); //uses SysUtils
try
F.write(PChar(s)^,length(s));
finally
F.Free;
end;
end;
end.