Форум программистов
 
Контакты: о проблемах с регистрацией, почтой и по другим вопросам пишите сюда - alarforum@yandex.ru, проверяйте папку спам! Обязательно пройдите активизацию e-mail.

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

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

Ответ
 
Опции темы
Старый 05.07.2018, 11:54   #11
Аватар
Модератор
Заслуженный модератор
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Адрес: Северодонецк.ua
Сообщений: 18,096
Репутация: 6385
По умолчанию

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

add

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

Последний раз редактировалось Аватар; 05.07.2018 в 12:30.
Аватар на форуме   Ответить с цитированием
Старый 05.07.2018, 15:00   #12
Serge_Bliznykov
МегаМодератор
СуперМодератор
 
Регистрация: 09.01.2008
Сообщений: 24,614
Репутация: 5352
По умолчанию

в данном случае сработает такой код:
Код:

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, 03:06   #13
northener
Профессионал
 
Регистрация: 15.07.2013
Сообщений: 1,460
Репутация: 477
По умолчанию

Цитата:
Сообщение от evg_m Посмотреть сообщение
F.Read( @mystr[1],
Уважаемый evg_m, пожалуйста не впутывайте в эту темную историю собак! Они тут вовсе не при чем
Компилятор Дельфи испокон веков правильно вставляет начальный адрес буфера в конструкции
Код:

F.Read(mystr[1],

northener вне форума   Ответить с цитированием
Старый 06.07.2018, 10:16   #14
min@y™
Цифровой кот
Профессионал
 
Аватар для min@y™
 
Регистрация: 29.08.2014
Адрес: 1600, пенсильвания-авеню, п.г.т. верхний Вашингтонск, 8126 км от МКАД, от поста ГАИ - налево.
Сообщений: 7,636
Репутация: 2398

icq: 100500
skype: kick-ass
По умолчанию

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

До одного мегабайта. Позвольте подниму свою же тему, и вернусь с уже новой проблемой того же поля.
Помогите поправить исправно работающий код. Он корректно ищет строку из 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, 21:28   #16
min@y™
Цифровой кот
Профессионал
 
Аватар для min@y™
 
Регистрация: 29.08.2014
Адрес: 1600, пенсильвания-авеню, п.г.т. верхний Вашингтонск, 8126 км от МКАД, от поста ГАИ - налево.
Сообщений: 7,636
Репутация: 2398

icq: 100500
skype: kick-ass
По умолчанию

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

Я пытаюсь предположить, но не уверен что есть какой либо вменяемый ответ на это, ввиду страшной безграмотности.
В среднем редактируемый файл 100-300кб. А то и меньше 100 даже.
Fakov вне форума   Ответить с цитированием
Старый 07.07.2018, 00:02   #18
min@y™
Цифровой кот
Профессионал
 
Аватар для min@y™
 
Регистрация: 29.08.2014
Адрес: 1600, пенсильвания-авеню, п.г.т. верхний Вашингтонск, 8126 км от МКАД, от поста ГАИ - налево.
Сообщений: 7,636
Репутация: 2398

icq: 100500
skype: kick-ass
По умолчанию

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

Вероятно, размер файла влияет на скорость работы с ним)
Fakov вне форума   Ответить с цитированием
Старый 07.07.2018, 00:19   #20
min@y™
Цифровой кот
Профессионал
 
Аватар для min@y™
 
Регистрация: 29.08.2014
Адрес: 1600, пенсильвания-авеню, п.г.т. верхний Вашингтонск, 8126 км от МКАД, от поста ГАИ - налево.
Сообщений: 7,636
Репутация: 2398

icq: 100500
skype: kick-ass
По умолчанию

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

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

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

000077.png

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

Опции темы

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.

Быстрый переход

Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Поиск и замена байтов Fakov Общие вопросы Delphi 4 19.06.2018 11: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 22:39
макрос на поиск и замену. Что не так? Viento Microsoft Office Excel 6 11.02.2009 23:36


13:32.


Powered by vBulletin® Version 3.8.8 Beta 2
Copyright ©2000 - 2018, Jelsoft Enterprises Ltd.

RusProfile.ru


Справочник российских юридических лиц и организаций.
Проекты отопления, пеллетные котлы, бойлеры, радиаторы
интернет магазин respective.ru