AGB  ·  Datenschutz  ·  Impressum  







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

Leerzeichen in Unterstriche umwandeln

Ein Thema von Snow Dragon · begonnen am 5. Feb 2009 · letzter Beitrag vom 11. Feb 2009
Antwort Antwort
Seite 1 von 2  1 2      
Snow Dragon

Registriert seit: 5. Feb 2009
5 Beiträge
 
#1

Leerzeichen in Unterstriche umwandeln

  Alt 5. Feb 2009, 11:05
Hallo,
ich hab ein Problem mit Leerzeichen, bzw. dem Umwandeln.
Und zwar schreibe ich gerade an einem Programm was Text im CeasarCode verschüsseln soll, das halt am besten mit Leerzeichen oder Umwandlung der Leerzeichen in _ oder der ähnlichen. Der Quellcode sieht immoment wie folgt aus:
Delphi-Quellcode:
begin
  s:=edein.text;
  sch:=StrToint(lbein.text);
  FOR I:=1 TO length(s) DO
    BEGIN
    c:=s[i];
    case c of
      'A' .. 'Z' : s1 := s1 + c;
      'a' .. 'z' : s1 := s1 + upcase(c);
      'ß'        : s1 := s1 + 'SS';
      'ä'        : s1 := s1 + 'AE';
      'ö'        : s1 := s1 + 'OE';
      'ü'        : s1 := s1 + 'UE';
      'Ä'        : s1 := s1 + 'AE';
      'Ö'        : s1 := s1 + 'OE';
      'Ü'        : s1 := s1 + 'UE';
    END;
    END;
    aus:='';
   for ii:=1 to length(s1) do
    begin
     c:=s1[ii];
     ASCII:=ord(c)+sch;
     aus:=aus+CHR(ASCII);
    end;
edaus.lines.add(aus);
end;
Das ist der Programmteil fürs Verschlüsseln. Wenn ich da allerdings nun einen Satz mir Leerzeichen eingebe kommt unten ein zusammengequetschtes Zeug raus und ist nach dem Entschlüsseln kaum zu lesen.

Freu mic hschon auf eure Beiträge
  Mit Zitat antworten Zitat
mkinzler
(Moderator)

Registriert seit: 9. Dez 2005
Ort: Heilbronn
39.861 Beiträge
 
Delphi 11 Alexandria
 
#2

Re: Leerzeichen in Unterstriche umwandeln

  Alt 5. Feb 2009, 11:10
Schau dir mal StringReplace() an
Markus Kinzler
  Mit Zitat antworten Zitat
nahpets
(Gast)

n/a Beiträge
 
#3

Re: Leerzeichen in Unterstriche umwandeln

  Alt 5. Feb 2009, 12:15
Hallo,
Zitat von Snow Dragon:
Hallo,
ich hab ein Problem mit Leerzeichen, bzw. dem Umwandeln.
Und zwar schreibe ich gerade an einem Programm was Text im CeasarCode verschüsseln soll, das halt am besten mit Leerzeichen oder Umwandlung der Leerzeichen in _ oder der ähnlichen. Der Quellcode sieht immoment wie folgt aus:
Delphi-Quellcode:
begin
  s:=edein.text;
  sch:=StrToint(lbein.text);
  FOR I:=1 TO length(s) DO
    BEGIN
    c:=s[i];
    case c of
      'A' .. 'Z' : s1 := s1 + c;
      'a' .. 'z' : s1 := s1 + upcase(c);
      'ß'        : s1 := s1 + 'SS';
      'ä'        : s1 := s1 + 'AE';
      'ö'        : s1 := s1 + 'OE';
      'ü'        : s1 := s1 + 'UE';
      'Ä'        : s1 := s1 + 'AE';
      'Ö'        : s1 := s1 + 'OE';
      'Ü'        : s1 := s1 + 'UE';
    END;
    END;
    aus:='';
   for ii:=1 to length(s1) do
    begin
     c:=s1[ii];
     ASCII:=ord(c)+sch;
     aus:=aus+CHR(ASCII);
    end;
edaus.lines.add(aus);
end;
Das ist der Programmteil fürs Verschlüsseln. Wenn ich da allerdings nun einen Satz mir Leerzeichen eingebe kommt unten ein zusammengequetschtes Zeug raus und ist nach dem Entschlüsseln kaum zu lesen.

Freu mic hschon auf eure Beiträge
erweitere doch Deine Case-Abfrage um ein
      ' '        : s1 := s1 + '_'; Welchen Wert enthält sch?
Wenn Ord(c) + sch > 255 wird, können aus Chr(Ascii) nichtdarstellbare Zeichen werden.
  Mit Zitat antworten Zitat
Benutzerbild von SirThornberry
SirThornberry
(Moderator)

Registriert seit: 23. Sep 2003
Ort: Bockwen
12.235 Beiträge
 
Delphi 2006 Professional
 
#4

Re: Leerzeichen in Unterstriche umwandeln

  Alt 5. Feb 2009, 12:25
Zitat von mkinzler:
Schau dir mal StringReplace() an
Wenn es um mehrere Ersetzungen geht ist die Schleife wohl der sinnvollere Weg.
Jens
Mit Source ist es wie mit Kunst - Hauptsache der Künstler versteht's
  Mit Zitat antworten Zitat
Tyrael Y.

Registriert seit: 28. Jul 2003
Ort: Stuttgart
1.093 Beiträge
 
Delphi 2007 Professional
 
#5

Re: Leerzeichen in Unterstriche umwandeln

  Alt 5. Feb 2009, 12:30
Zitat von SirThornberry:
Zitat von mkinzler:
Schau dir mal StringReplace() an
Wenn es um mehrere Ersetzungen geht ist die Schleife wohl der sinnvollere Weg.

Wie kommst du denn darauf?

Zitat:
type
TReplaceFlags = set of (rfReplaceAll, rfIgnoreCase);
function StringReplace(const S, OldPattern, NewPattern: string; Flags: TReplaceFlags): string;

Beschreibung

Mit StringReplace ersetzen Sie in dem angegebenen String den im Parameter OldPattern festgelegten Sub-String mit dem im Parameter NewPattern übergebenen neuen Sub-String. StringReplace nimmt an, daß der String Multibyte-Zeichen enthalten kann.

Wenn im Parameter Flags nicht rfReplaceAll enthalten ist, wird nur das erste Vorkommen von OldPattern im String S ersetzt. Andernfalls werden alle Instanzen von OldPattern durch NewPattern ersetzt.

Wenn der Parameter Flags rfIgnoreCase enthält, wird die Groß-/Kleinschreibung nicht berücksichtigt.
Levent Yildirim
Erzeugung von Icons aus Bildern:IconLev
  Mit Zitat antworten Zitat
Benutzerbild von Jens Hartmann
Jens Hartmann

Registriert seit: 11. Jan 2009
Ort: Wilnsdorf
1.439 Beiträge
 
Delphi XE2 Professional
 
#6

Re: Leerzeichen in Unterstriche umwandeln

  Alt 5. Feb 2009, 12:46
Hallo erstmal,

Schau die mal diesen Tread von mir an, ich habe auch das Problem gehabt diverse Zeichen zu ersetzten.

Vieleicht hilft Dir der ja weiter, dort habe ich dann auch die Lösung mit StringReplaced genutzt.

StringReplaced

MFG

Jens
Jens Hartmann
Das Leben selber ist zu kurz, also nutze jeden Tag wie er kommt.
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.184 Beiträge
 
Delphi 12 Athens
 
#7

Re: Leerzeichen in Unterstriche umwandeln

  Alt 5. Feb 2009, 12:56
Zitat von Tyrael Y.:
Zitat von SirThornberry:
Wenn es um mehrere Ersetzungen geht ist die Schleife wohl der sinnvollere Weg.
Wie kommst du denn darauf?

Zitat:
type
TReplaceFlags = set of (rfReplaceAll, rfIgnoreCase);
er meinte mehrere verschiedene Ersetzungen
StringReplace erstetzt nur ein Zeichen/String (und das notfalls mehrmals)

aber irgendwo hier in der DP gab's 'ne StringReplace-Variante, der man statt Strings ganze Arrays übergeben konnte. (evtl. sogar in der CodeLib)
$2B or not $2B
  Mit Zitat antworten Zitat
Snow Dragon

Registriert seit: 5. Feb 2009
5 Beiträge
 
#8

Re: Leerzeichen in Unterstriche umwandeln

  Alt 5. Feb 2009, 14:55
Zitat von nahpets:
erweitere doch Deine Case-Abfrage um ein
      ' '        : s1 := s1 + '_'; Welchen Wert enthält sch?
Wenn Ord(c) + sch > 255 wird, können aus Chr(Ascii) nichtdarstellbare Zeichen werden.
das mit der erweiterten CASE abfrage ging leider nicht, so schlau war ich auchschon.
Sch steht hier für schlüssel und ist eine zahl die vom Benutzer gewählt wird also 5 oder 6 oder auch 1234, das geht soweit auch wieder zu entschlüsseln auch wenns bei großen zahlen meistens nach humbuk aussieht^^
kann man denn lehrzeilen mit StringReplace() ersetzen?

PS: Ein 'Hallo' würde mit nem Schlüssel von 1234 verschlüsselt ungefähr so aussehen:
!
Wie man erkennt erkennt man nichts aber kopiert mans ins Programm rein udn entschlüsselt gehts^^
  Mit Zitat antworten Zitat
nahpets
(Gast)

n/a Beiträge
 
#9

Re: Leerzeichen in Unterstriche umwandeln

  Alt 5. Feb 2009, 15:22
Hallo,
Zitat von Snow Dragon:
Zitat von nahpets:
erweitere doch Deine Case-Abfrage um ein
      ' '        : s1 := s1 + '_'; Welchen Wert enthält sch?
Wenn Ord(c) + sch > 255 wird, können aus Chr(Ascii) nichtdarstellbare Zeichen werden.
das mit der erweiterten CASE abfrage ging leider nicht, so schlau war ich auchschon.
Sch steht hier für schlüssel und ist eine zahl die vom Benutzer gewählt wird also 5 oder 6 oder auch 1234, das geht soweit auch wieder zu entschlüsseln auch wenns bei großen zahlen meistens nach humbuk aussieht^^
kann man denn lehrzeilen mit StringReplace() ersetzen?

PS: Ein 'Hallo' würde mit nem Schlüssel von 1234 verschlüsselt ungefähr so aussehen:
!
Wie man erkennt erkennt man nichts aber kopiert mans ins Programm rein udn entschlüsselt gehts^^
Leerzeilen könntest Du an zwei aufeinanderfolgende Zeilenumbrüchen (#13#10#13#10) erkennen, das müsste mit StringReplace eigentlich zu ersetzen sein.
StringReplace(Zeichenfolge,#13#10#13#10,'****',[rfReplaceAll]);
  Mit Zitat antworten Zitat
globetrotter77

Registriert seit: 16. Jan 2009
Ort: Nürnberg
236 Beiträge
 
Delphi 10.3 Rio
 
#10

Re: Leerzeichen in Unterstriche umwandeln

  Alt 5. Feb 2009, 16:06
lass mal besser die Umwandlung von ß und Umlauten sein, die ist irreversibel und damit nicht mehr entschlüsselbar.
Im Gegensatz zur Umwandlung zu Caesars Zeiten geht es doch darum, alle Zeichen eines Strings um den gleichen Versatz zu verschieben, oder?
Würde ich jedenfalls mal empfehlen, denn dann fängst du auch Kandidaten mit Akzenten etc. ein ...
Und dann reicht es völlig, die Position im zugrundeliegenden Zeichensatz zu ermitteln, den Versatz zu addieren und danach wieder in ein Zeichen zu verwandeln, allerdings modulo 256, weil sonst ein Überlauf entstehen könnte, bei dem ich nicht weiß, was Delphi draus macht.

Also z.B. so:
Delphi-Quellcode:

const versatz = 7;

function codieren(s: string): string;
var i: integer;
    c: char; // ein Zeichen
    p: integer;
    x: string; // das Zwischenergebnis
begin
  x:='';
  for i:=1 to Length(s) do
  begin
    c:=s[i];
    p:=ord(c);
    p:=(p+versatz) mod 256;
    c:=chr(p);
    x:=x+c;
  end;
  Result:=x;
end;

function decodieren(s: string): string;
var i: integer;
    c: char; // ein Zeichen
    p: integer;
    x: string; // das Zwischenergebnis
begin
  x:='';
  for i:=1 to Length(s) do
  begin
    c:=s[i];
    p:=ord(c);
    p:=(p-versatz) mod 256; // Minus statt Plus!
    c:=chr(p);
    x:=x+c;
  end;
  Result:=x;
end;
Man kann das natürlich auch zusammenfassen in z.B.
  x:=x+chr((ord(s[i])+/-versatz) mod 256); das macht's aber eigentlich nur unlesbar und bringt kaum Vorteile.


Wichtig:
der resultierende String enthält in der Regel auch unlesbare bzw. nicht druckbare Zeichen, was aber normalerweise nichts machen dürfte, weil man es ja nicht lesen soll.
Das gibt nur Probleme, wenn man es auch in einer Datei abspeichern will.
Da gibt es zwei Möglichkeiten:
1) Speichern in binärer Datei, dann machen die Steuerzeichen nichts
2) Speichern in Textdatei, dann muss man die Routine abwandeln derart, dass nur die lesbaren Zeichen umgewandelt werden, also von #32 bis #255
Hierzu muss zunächst einmal eine Abbildung von #32..#255 auf #0..223 erfolgen, danach der gleiche Algorithmus, aber mit modulo 224, und danach wieder eine Abbildung von #0..#223 auf #32..#255 ... das war's!
  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 22:33 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