Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 05.07.2018, 10:54   #11
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 19,042
По умолчанию

Дело не в @. Посмотри как ведет себя PChar() от строки начинающейся с #0. Пофиг что дальше, будет получен адрес пустой строки. А StringReplace и использует PChar() в цепочке обращений.

add

Pos и PosEx нормально обработают двоичный ноль в строке. Вот ими и пользуйся, забей на StringReplace
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию

Последний раз редактировалось Аватар; 05.07.2018 в 11:30.
Аватар вне форума Ответить с цитированием
Старый 05.07.2018, 14:00   #12
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,238
По умолчанию

в данном случае сработает такой код:
Код:
procedure TForm1.Button1Click(Sender: TObject);
var
  F   : TFileStream;
  mystr : AnsiString;
  s1, s2, s3, s4 : AnsiString;
  i : integer;
begin

  s1 := #$00#$42#$54#$4E;
  s2 := #$0D#$42#$54#$4E;


  s3 := #$00#$44#$49#$53;
  s4 := #$0D#$44#$49#$53;

    F := TFileStream.Create(OpenDialog1.FileName, fmOpenReadWrite);
    try
      SetLength(mystr, F.Size);
      F.Read(mystr[1], F.Size);
    finally
      F.Free;
    end;

    for i := 1 to Length(mystr)+1-Length(s1) do begin
       if mystr[i]=#00 then begin
          if ((mystr[i+1] = s1[2]) and (mystr[i+2] = s1[3]) and (mystr[i+3] = s1[4]))
          or ((mystr[i+1] = s3[2]) and (mystr[i+2] = s3[3]) and (mystr[i+3] = s3[4]))
               then mystr[i] := #$0D
       end;
    end;


    F := TFileStream.Create(OpenDialog1.FileName, fmCreate or fmOpenWrite);
    try
      F.write(mystr[1], length(mystr));
    finally
      F.Free;
    end;
end;

код, конечно, не красивый и не универсальный, но зато работает.
Serge_Bliznykov вне форума Ответить с цитированием
Старый 06.07.2018, 02:06   #13
northener
ПШП
Участник клуба
 
Регистрация: 15.07.2013
Сообщений: 1,859
По умолчанию

Цитата:
Сообщение от evg_m Посмотреть сообщение
F.Read( @mystr[1],
Уважаемый evg_m, пожалуйста не впутывайте в эту темную историю собак! Они тут вовсе не при чем
Компилятор Дельфи испокон веков правильно вставляет начальный адрес буфера в конструкции
Код:
F.Read(mystr[1],
northener вне форума Ответить с цитированием
Старый 06.07.2018, 09:16   #14
min@y™
Цифровой кот
Старожил
 
Аватар для min@y™
 
Регистрация: 29.08.2014
Сообщений: 7,656
По умолчанию

ТС, а зачем, собственно, понадобились такие действия над данными?
О каких объёмах файлов идёт речь?
Расскажу я вам, дружочки, как выращивать грибочки: нужно в поле утром рано сдвинуть два куска урана...
min@y™ вне форума Ответить с цитированием
Старый 06.07.2018, 20:09   #15
Fakov
Пользователь
 
Регистрация: 13.12.2009
Сообщений: 85
По умолчанию

До одного мегабайта. Позвольте подниму свою же тему, и вернусь с уже новой проблемой того же поля.
Помогите поправить исправно работающий код. Он корректно ищет строку из 4 байт FindDataDIS и заменяет ее на строку из 4 байт ChangeDataDIS.
Как мне поправить данный код, чтобы он заменял строку из 4 байт строкой из 47 байт?

Код:
Reset(fn,1);
  While Not Eof(fn) Do
  Begin
    BlockRead(fn,Buf,65536,ii);
    b:=False;
    For i:=0 To (ii-5) Do
    Begin
      b1:=True;
      b2:=True;
      For j:=0 To 3 Do
      If Buf[i+j]<>FindDataDIS[j] Then
      Begin
        b1:=False;
        Break;
      End;
 
      If b1 Then
      Begin
        For j:=0 To 3 Do Buf[i+j]:=ChangeDataDIS[j];
        b:=True; 
      End;
 
    End;
    If b Then
    Begin
       Seek(fn,FilePos(fn)-ii);
       Write(fn,Buf,ii));
    End;
    If Eof(fn) Then Break;
    Seek(fn,FilePos(fn)-3);
  End;
  CloseFile(fn);
Fakov вне форума Ответить с цитированием
Старый 06.07.2018, 20:28   #16
min@y™
Цифровой кот
Старожил
 
Аватар для min@y™
 
Регистрация: 29.08.2014
Сообщений: 7,656
По умолчанию

Цитата:
Сообщение от Fakov Посмотреть сообщение
До одного мегабайта.
Я это не из праздного любопытства спрашивал. Как думаешь, для чего?
Расскажу я вам, дружочки, как выращивать грибочки: нужно в поле утром рано сдвинуть два куска урана...
min@y™ вне форума Ответить с цитированием
Старый 06.07.2018, 22:59   #17
Fakov
Пользователь
 
Регистрация: 13.12.2009
Сообщений: 85
По умолчанию

Я пытаюсь предположить, но не уверен что есть какой либо вменяемый ответ на это, ввиду страшной безграмотности.
В среднем редактируемый файл 100-300кб. А то и меньше 100 даже.
Fakov вне форума Ответить с цитированием
Старый 06.07.2018, 23:02   #18
min@y™
Цифровой кот
Старожил
 
Аватар для min@y™
 
Регистрация: 29.08.2014
Сообщений: 7,656
По умолчанию

Цитата:
Сообщение от Fakov Посмотреть сообщение
Я пытаюсь предположить
Давай, говори уже, не ссы, тут все свои! А то я скоро спать сваливаю. Сожрал таблетку снотворного размером с хоккейную шайбу.
Расскажу я вам, дружочки, как выращивать грибочки: нужно в поле утром рано сдвинуть два куска урана...
min@y™ вне форума Ответить с цитированием
Старый 06.07.2018, 23:08   #19
Fakov
Пользователь
 
Регистрация: 13.12.2009
Сообщений: 85
По умолчанию

Вероятно, размер файла влияет на скорость работы с ним)
Fakov вне форума Ответить с цитированием
Старый 06.07.2018, 23:19   #20
min@y™
Цифровой кот
Старожил
 
Аватар для min@y™
 
Регистрация: 29.08.2014
Сообщений: 7,656
По умолчанию

Цитата:
Сообщение от Fakov Посмотреть сообщение
Вероятно, размер файла влияет на скорость работы с ним)
Уже теплее.
Ладно, расскажу, как бы это делал я.
Если файл приемлемого размера, то гораздо проще загрузить его в память полностью и работать с ним как с массивом байтов по указателю. Для поиска читать побайтно не из файла, а из его копии в памяти. А для замены - не заниматься ерундой, гоняя буфера внутри массива с перераспределениями, а создать новый массив, куда и писать данные с учётом замен. А после всех замен сохранить всё сразу в другой файл или прям поверх исходного, если надо.

я понятно объясняю.jpg

А для чтения памяти побайтно есть TMemoryStream и его прекрасное свойство Memory: Pointer.

000077.png

Всё, я спать, дальше сам давай.
Расскажу я вам, дружочки, как выращивать грибочки: нужно в поле утром рано сдвинуть два куска урана...
min@y™ вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Поиск и замена байтов Fakov Общие вопросы Delphi 4 19.06.2018 10:04
SOS!!! Макрос Excel на поиск и замену слов в таблице. ukk-kz Microsoft Office Excel 2 27.05.2014 10:54
Excel, Как осуществить поиск и замену сразу нескольких фрагментов текста? Танита Помощь студентам 0 24.05.2012 00:18
Поправить прогу... Поиск. twister_answer Помощь студентам 0 06.12.2010 21:39
макрос на поиск и замену. Что не так? Viento Microsoft Office Excel 6 11.02.2009 22:36