[Delphi]Поиск строки в MemoryStream

Discussion in 'С/С++, C#, Rust, Swift, Go, Java, Perl, Ruby' started by Steam[777], 9 Jan 2011.

  1. Steam[777]

    Steam[777] Elder - Старейшина

    Joined:
    27 Sep 2010
    Messages:
    296
    Likes Received:
    43
    Reputations:
    25
    Сабж, собственно
    Пробовал SetString(MyStr,PChar(ms.memory),ms.Size), но строка длиннее 4096 байт не получалась, если делать .Read или .ReadBuffer - и шанс, что искомую подстроку разобьет на несколько и она не найдется всегда есть.
    P.S. Раньше отписывал в файл и искал там, но теперь решил перейти к многопоточности, и такой вариант уже не подходит ))
    Подскажите, pls, как будет правильнее?
     
  2. otRock

    otRock Elder - Старейшина

    Joined:
    13 Aug 2008
    Messages:
    0
    Likes Received:
    5
    Reputations:
    0
    На сколько я помню.. самый простой вариант - это создать в потоке TStringList и в него загрузить этот MemoryStream.. и искать уже в StringList'e..

    PS: ТОПОРНЫЙ метод. подойдёт только новичкам!))
    PPS: сори нет Delphi под рукой, не могу на память помочь..\\
     
  3. slesh

    slesh Elder - Старейшина

    Joined:
    5 Mar 2007
    Messages:
    2,702
    Likes Received:
    1,224
    Reputations:
    455
    получаешь адрес памяти где расположены данные и тупо юзаешь это как pchar и в ней ишеш, главное не забывать про конец строки
     
  4. Jingo Bo

    Jingo Bo Member

    Joined:
    25 Oct 2009
    Messages:
    368
    Likes Received:
    51
    Reputations:
    7
    Вот, ток что накалякал :
    Code:
    function FindStringFromMem(AText : String; AMemory : Pointer; ASize : Cardinal) : Pointer;
    Var _cp : Cardinal; 
        _tp : Cardinal; 
    Begin
        Result := nil;
        if (Length(AText) = 0) or (ASize = 0) then Exit;
        _tp := 1;
        _cp := Cardinal(AMemory);
        while (_cp < Cardinal(AMemory) + ASize) do
        Begin
            if AText[_tp] = PChar(Pointer(_cp))^ then
              if _tp = Length(AText) then
              Begin
                  Result := Pointer(_cp - Length(AText) + 1);
                  Exit;
              end else
                Inc(_tp);
            Inc(_cp);
        end;
    end;
    Использовать p := FindStringFromMem('Эц', MemoryStream.Memory, MemoryStream.Size);