Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Netzwerke (https://www.delphipraxis.net/14-netzwerke/)
-   -   Delphi Indy: aus Stream lesen (https://www.delphipraxis.net/141292-indy-aus-stream-lesen.html)

Hedge 6. Okt 2009 15:48


Indy: aus Stream lesen
 
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?

Hedge 16. Okt 2009 10:16

Re: Indy: aus Stream lesen
 
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@4d¬À1!n«ª_Ö¢žyô+Õz‰`¼ñÞbÄ8K¥Þxo1bœ¥R? À``© 0Ñ©zE#¥Ó Ø1@ê„ÿú«Ó§*ŸsFÌûÓéǤù>Q0ašïÓþ Ð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

chaosben 16. Okt 2009 10:22

Re: Indy: aus Stream lesen
 
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;

himitsu 16. Okt 2009 10:30

Re: Indy: aus Stream lesen
 
Lad es doch einfach in einen String/AnsiString und laß Delphi-Referenz durchsuchenPos drüberlaufen :angel2:

Hedge 16. Okt 2009 10:54

Re: Indy: aus Stream lesen
 
Zitat:

Zitat von himitsu
Lad es doch einfach in einen String/AnsiString und laß Delphi-Referenz durchsuchenPos drüberlaufen :angel2:

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?

shmia 16. Okt 2009 16:06

Re: Indy: aus Stream lesen
 
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


Alle Zeitangaben in WEZ +1. Es ist jetzt 06:53 Uhr.

Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz