AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Netzwerke Delphi Indy: aus Stream lesen
Thema durchsuchen
Ansicht
Themen-Optionen

Indy: aus Stream lesen

Ein Thema von Hedge · begonnen am 6. Okt 2009 · letzter Beitrag vom 16. Okt 2009
Antwort Antwort
Hedge

Registriert seit: 30. Jun 2007
278 Beiträge
 
Delphi 2009 Professional
 
#1

Indy: aus Stream lesen

  Alt 6. Okt 2009, 15:48
Ich habe einen TidTCPServer.
Nachdem sich ein Client verbunden hat, schickt er mir bis zur Beendung der Verbindung einen Stream.
Diesen Stream muss ich nach einer bestimmten Zeichenketten durchsuchen.

Wie mach ich das am Dümmsten?
٩๏̯͡๏)۶
  Mit Zitat antworten Zitat
Hedge

Registriert seit: 30. Jun 2007
278 Beiträge
 
Delphi 2009 Professional
 
#2

Re: Indy: aus Stream lesen

  Alt 16. Okt 2009, 10:16
Ich habe mir mal das Ganze in einen Filestream schreiben lassen.
Das sieht dann so aus wie unten.

Das fett markiert ist das nach dem ich suche. Es steht immer ARTIST= vorne.
Wie durchsuche ich den Memory-Stream danach?

Zitat:
Ĥg¸f6Ñç* êñ]„Á§Ä¬·Ÿ7£/{Ë«Ø$ é `2 ²¬©HªvMÆt0 YÖT$U»&ã.‡€*Ããky-„Ñ Åã* €`5ÔÑQ›¢¨)bbXšØØÅN«*¦*–jiÚØi[¬Õ´°ŒDƒP`Œ%¬0´° *¨U<Ó¿ºæmúo^ÇÊ{¯Ìm.p 9c…H ¤Hþ›ü7"+ €8W ‘A¶Ù¯Ø¡pvêd¾å8œÒ
G D¨ e2Œe! *9þ6© ž ‚6ëŠí‹ \ Ÿ¦’5P“Ó›/fMÝŠf’_’R¥>棾¨©@tm.Yiþú7TJÊÄüç¡× lTµ}ƒ1#ZvvH}ýò¼z3ÏÜ >ÈÌóé²±(ªTÉaƒÌü0Ÿ.‹¢J•¶o|||<Gá> ©ÉU®€X¢XÅ4°e"b*XZµ±j©bÅŠÚ`ÛÖb§]ìjmª j †‘ Dˆâhºò1¢¡$`F§^÷hÈDEˆæŠdJ!Š«‚n^<%5YÊŽ/ó-~:ÓìäW3IÿOºB<^f›}õ)¿KÎx]IÝ^l
B¾«sd'ö‹•É$σ P£¥Ë°Êƒ˜Z`¸_õð›q>ëI¼‰ÿ`åëd¸:d" r‰¤9úÍc©—þ ªBBB„†
*Œ5QlBBLo- È»þ÷Ì¥ìRýú^ë3!£û{æRv©~}/õ™Ñ-³ÌÇ <>[!<iÇã*W1¶ÙÕp0
«ÍnQ»`USÄÓÆÆR¬má0TH b•* „¡ed°¢è|Òvs9QLŸz‡©p{Wx6F*PQ8˜€a™æèß?H;Ófà gvÝs!^‹|/WV†¤³¡b{+j‡*Æì|1']G±Äv`AÐt} ¾¨ !…a!ÀR·ü1g{’J_öª(xOö|²c€–‹Ä:¾áp“d¿€Q Yð¡”þ¶Ã;:Gï|Ã%àšS&YsÓØ\†¹”-܈á p…ù… |@~Ùäc‰‚´
P„#² @"$ˆŒ}{›Lêa½WØê™Ws Ôíö0%A|u»=LIßBPPLUU´2 £&õî|©äZ>ÿHã„ÌÓì ÌížpýÜî 1П*'"% +5ªÆˆmó x¾ê¼¿žVVSW+å×gÓžÀ Ôõž*˜]]ï©‚‰Ðý 8a¥@ol"¥F¨a
I*®¯Gž¡1¡? µ¸õºZ‡JÄäŸ8n<8æŸ8n<8¾:eA€ö¤„E
ÄØh4$À¡,aEˆ÷ä80Ëm_‡¬ ?¥ˆñ%ÿ5á§1¾äÿ ªTÒPjQE@4d¬À1!n«ª_Ö¢žyô+Õz‰`¼ñÞbÄ8K¥Þxo1bœ¥R? À``© 0Ñ©zE#¥Ó Ø1@ê„ÿú«Ó§*ŸsFÌûÓéǤù>Q0ašïÓþ Ã0Ï¡0Ñ(U•A$B(¡P„Ž·ƒ Š,ÙgÖÌÑ73Œ›ûp)<fb" ¼ t!ÿe»øÅ»ÿ²]üŒâ‡*d¥!
dµ6Q5L±¶4PQ¨ f 1#”ÕNÖ à
^)É—#p
xi2OggS  x: ï’4vorbis D¬ ô ô ô ¸OggS x:  Œh*è€ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿvorbis Xiph.Org libVorbis I 20070622 ( ENCODER=Native Instruments Media Library ARTIST=Cnut TITLE=My Happy RobotvorbisDBCV  €"LÄ€ÐU
٩๏̯͡๏)۶
  Mit Zitat antworten Zitat
Benutzerbild von chaosben
chaosben

Registriert seit: 27. Apr 2005
Ort: Görlitz
1.358 Beiträge
 
Delphi XE2 Professional
 
#3

Re: Indy: aus Stream lesen

  Alt 16. Okt 2009, 10:22
Ich hab mal das folgende verbrochen um schnell zu prüfen, ob eine Datei einen bestimmten Text enthält (caseinsensitive).
Mit ein bißchen Fleiß, kannste du dir den Teil rausnehmen, den du brauchst.

Delphi-Quellcode:
function FileContainsText(AFileName: String; AText: AnsiString): Boolean;
var
  MS : TMemoryStream;
  TextBuffer : PAnsiChar;
  TextLen : Integer;
  FileBuffer : PAnsiChar;
  FileBufferLastChar : PAnsiChar;
  PosInMemory : Integer;

  procedure LowerLastChar();
  begin
    if FileBufferLastChar^ in ['A'..'Z'] then
      FileBufferLastChar^ := AnsiChar(Ord(FileBufferLastChar^) + $20);
  end;
begin
  Result := false;

  Ms := TMemoryStream.Create;
  Ms.LoadFromFile(AFileName);

  TextLen := Length(AText);
  GetMem(TextBuffer, TextLen);
  try
    StrPCopy(TextBuffer, AnsiString(LowerCase(String(AText))));

    FileBufferLastChar := Ms.Memory;
    for PosInMemory := 0 to TextLen - 2 do
    begin
      LowerLastChar;
      Inc(FileBufferLastChar);
    end;

    FileBuffer := Ms.Memory;
    PosInMemory := TextLen - 1;
    FileBufferLastChar := Pointer(Integer(FileBuffer) + PosInMemory);

    while PosInMemory < Ms.Size do
    begin
      LowerLastChar;

      if CompareMem(TextBuffer, FileBuffer, TextLen) then
      begin
        Result := true;
        break;
      end;

      Inc(PosInMemory);
      Inc(FileBuffer);
      Inc(FileBufferLastChar);
    end;
    

  finally
    Ms.Free;
    FreeMem(TextBuffer, TextLen);
  end;
end;
Benjamin Schwarze
If I have seen further it is by standing on the shoulders of Giants. (Isaac Newton)
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

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

Re: Indy: aus Stream lesen

  Alt 16. Okt 2009, 10:30
Lad es doch einfach in einen String/AnsiString und laß Delphi-Referenz durchsuchenPos drüberlaufen
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list : BugReports/FeatureRequests
  Mit Zitat antworten Zitat
Hedge

Registriert seit: 30. Jun 2007
278 Beiträge
 
Delphi 2009 Professional
 
#5

Re: Indy: aus Stream lesen

  Alt 16. Okt 2009, 10:54
Zitat von himitsu:
Lad es doch einfach in einen String/AnsiString und laß Delphi-Referenz durchsuchenPos drüberlaufen
Ich kann auch direkt AContext.Connection.IOHandler.ReadString()benutzen , aber woher weiß ich wie lang die Daten sind die im OnExecute TIdTCPServer im AContext: TIdContext landen?
٩๏̯͡๏)۶
  Mit Zitat antworten Zitat
shmia

Registriert seit: 2. Mär 2004
5.508 Beiträge
 
Delphi 5 Professional
 
#6

Re: Indy: aus Stream lesen

  Alt 16. Okt 2009, 16:06
Zu Beachten ist, dass die Daten aus dem Stream portionsweise eintreffen, wobei nicht vorhersehbar ist,
wie gross die einzelnen Portionen (Pakete) sind.
Dein Suchtext kann also auf zwei Portionen verteilt sein.
Wenn der Suchtext "ARTIST=" lautet, muss also ein Puffer von 6 Zeichen vorhanden sein.
Es könnte ja sein, dass am Ende von Paket 57 der Text "ARTIST" steht, während das Paket 58 mit "=" beginnt.

Siehe auch: http://de.wikipedia.org/w/index.php?...ng-Algorithmus
Andreas
  Mit Zitat antworten Zitat
Antwort Antwort


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 11:01 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