powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Поиск последовательности в бинарном массиве
25 сообщений из 270, страница 2 из 11
Поиск последовательности в бинарном массиве
    #39586689
rgreat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
BellicЧитал разом файл в массив TByte и спокойно работал с ним, а в RawByteString - реально засунуть бинарник длиной к примеру 25 Мбайт а потом искать в нем вхождение с помощью Pos?2 Гб влезает.
...
Рейтинг: 0 / 0
Поиск последовательности в бинарном массиве
    #39586701
Няшик
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
rgreatНо вангую что Pos +RawByteString будет работать быстрей.

О да.. Быстрее

Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
function Pos(const SubStr, Str: _RawByteStr; Offset: Integer): Integer;
{$IFDEF PUREPASCAL}
var
  I, LIterCnt, L, J: Integer;
  PSubStr, PS: _PAnsiChr;
begin
  L := Length(SubStr);
  { Calculate the number of possible iterations. Not valid if Offset < 1. }
  LIterCnt := Length(Str) - Offset - L + 1;

  { Only continue if the number of iterations is positive or zero (there is space to check) }
  if (Offset > 0) and (LIterCnt >= 0) and (L > 0) then
  begin
    PSubStr := _PAnsiChr(SubStr);
    PS := _PAnsiChr(Str);
    Inc(PS, Offset - 1);

    for I := 0 to LIterCnt do
    begin
      J := 0;
      while (J >= 0) and (J < L) do
      begin
        if PS[I + J] = PSubStr[J] then
          Inc(J)
        else
          J := -1;
      end;
      if J >= L then
        Exit(I + Offset);
    end;
  end;

  Result := 0;
end;

...
Рейтинг: 0 / 0
Поиск последовательности в бинарном массиве
    #39586704
rgreat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Няшик,

Давно ли ты сорцы с директивой PUREPASCAL пересобирал?

у нормальных людей как-то так
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
83.
84.
85.
86.
87.
88.
89.
90.
91.
92.
93.
94.
95.
96.
97.
98.
99.
100.
101.
102.
103.
104.
105.
106.
107.
108.
{$ELSE !PUREPASCAL}
{$IFDEF CPUX86}
(* ***** BEGIN LICENSE BLOCK *****
 *
 * The function PosEx is licensed under the CodeGear license terms.
 *
 * The initial developer of the original code is Fastcode
 *
 * Portions created by the initial developer are Copyright (C) 2002-2004
 * the initial developer. All Rights Reserved.
 *
 * Contributor(s): Aleksandr Sharahov
 *
 * ***** END LICENSE BLOCK ***** *)
asm
       test  eax, eax
       jz    @Nil
       test  edx, edx
       jz    @Nil
       dec   ecx
       jl    @Nil

       push  esi
       push  ebx

       mov   esi, [edx-4]  //Length(Str)
       mov   ebx, [eax-4]  //Length(Substr)
       sub   esi, ecx      //effective length of Str
       add   edx, ecx      //addr of the first AnsiChar at starting position
       cmp   esi, ebx
       jl    @Past         //jump if EffectiveLength(Str)<Length(Substr)
       test  ebx, ebx
       jle   @Past         //jump if Length(Substr)<=0

       add   esp, -12
       add   ebx, -1       //Length(Substr)-1
       add   esi, edx      //addr of the terminator
       add   edx, ebx      //addr of the last AnsiChar at starting position
       mov   [esp+8], esi  //save addr of the terminator
       add   eax, ebx      //addr of the last AnsiChar of Substr
       sub   ecx, edx      //-@Str[Length(Substr)]
       neg   ebx           //-(Length(Substr)-1)
       mov   [esp+4], ecx  //save -@Str[Length(Substr)]
       mov   [esp], ebx    //save -(Length(Substr)-1)
       movzx ecx, byte ptr [eax] //the last AnsiChar of Substr

@Loop:
       cmp   cl, [edx]
       jz    @Test0
@AfterTest0:
       cmp   cl, [edx+1]
       jz    @TestT
@AfterTestT:
       add   edx, 4
       cmp   edx, [esp+8]
       jb   @Continue
@EndLoop:
       add   edx, -2
       cmp   edx, [esp+8]
       jb    @Loop
@Exit:
       add   esp, 12
@Past:
       pop   ebx
       pop   esi
@Nil:
       xor   eax, eax
       ret
@Continue:
       cmp   cl, [edx-2]
       jz    @Test2
       cmp   cl, [edx-1]
       jnz   @Loop
@Test1:
       add   edx,  1
@Test2:
       add   edx, -2
@Test0:
       add   edx, -1
@TestT:
       mov   esi, [esp]
       test  esi, esi
       jz    @Found
@AnsiString:
       movzx ebx, word ptr [esi+eax]
       cmp   bx, word ptr [esi+edx+1]
       jnz   @AfterTestT
       cmp   esi, -2
       jge   @Found
       movzx ebx, word ptr [esi+eax+2]
       cmp   bx, word ptr [esi+edx+3]
       jnz   @AfterTestT
       add   esi, 4
       jl    @AnsiString
@Found:
       mov   eax, [esp+4]
       add   edx, 2

       cmp   edx, [esp+8]
       ja    @Exit

       add   esp, 12
       add   eax, edx
       pop   ebx
       pop   esi
end;
{$ENDIF CPUX86}
{$ENDIF !PUREPASCAL}

...
Рейтинг: 0 / 0
Поиск последовательности в бинарном массиве
    #39586707
Bellic
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
НяшикrgreatНо вангую что Pos +RawByteString будет работать быстрей.
О да.. Быстрее
У меня код Поиска и Замены на TByte получился с таким же количеством строк..)))
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
AddressBin := 0;
while AddressBin <= (SizeBinFile - LenBPoisk) do
  begin // Сравниваем побайтно ФразуПоиска и БИН-файл
       for j := 0 to LenBPoisk - 1 do
             begin
                  if BBin[AddressBin + j] <> BPoisk[j] then
                        begin // Байты - НЕ равны
                             Ravno := False; // Флаг Равенства байтов
                             Break;  // Выход из цикла если байты не равны-нет смысла дальше сравнивать
                         end
                  else  // Байты - Равны
                         Ravno := True; // Флаг Pавенства байтов
             end;

             if Ravno then  // Нашли строку в БИН-файле-Меняем Поисковую строку на ФразуЗамены
                 begin
                     for k := 0 to LenBPoisk - 1 do // Производим Замену
                          begin
                              BBin[AddressBin + k] := BZamena[k];
                          end;
                     Inc(NumTrans);  // Считаем количество произведенных замен
                     // Коррекция на длину фразы, чтоб искать дальше
                     AddressBin := AddressBin + LenBPoisk;
                 end
              else  //===== Фразы HE pавны ====
                     Inc(AddressBin); // продолжаем дальше искать по файлу
  end;


Но даже тут возможно еще что то оптимизировать!?
...
Рейтинг: 0 / 0
Поиск последовательности в бинарном массиве
    #39586709
rgreat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Выше - код на ассемблере.
...
Рейтинг: 0 / 0
Поиск последовательности в бинарном массиве
    #39586710
Bellic
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
rgreatДавно ли ты сорцы с директивой PUREPASCAL пересобирал? rgreat , а вот это уже серьезный шаг!!! Класс!
Суть я понял, но вижу первый раз!
...
Рейтинг: 0 / 0
Поиск последовательности в бинарном массиве
    #39586713
Bellic
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
rgreatВыше - код на ассемблере.
И много таких замен существует для функций и прочего? (Может и мне пора пересборкой занятся?.. )
...
Рейтинг: 0 / 0
Поиск последовательности в бинарном массиве
    #39586714
rgreat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Bellic,

Оно под виндой и так на ассемблере. Ничего делать не надо.
...
Рейтинг: 0 / 0
Поиск последовательности в бинарном массиве
    #39586724
Няшик
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
rgreat,

64 битном приложение твой asm - не будет работать. И вся оптимизация к коту под-хвост.

Да-да. Если он надумаем, или уже использует 64 битный компилятор.

То всё, его код будет медленным.

На 32 битном приложение asm быстрее в 10 раз .
...
Рейтинг: 0 / 0
Поиск последовательности в бинарном массиве
    #39586729
Bellic
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
rgreatНо вангую что Pos +RawByteString будет работать быстрей.Кстати - с помошью Pos() смещение до первого вхождения я то найду, а с последующими как быть?
Искомая последовательность ведь может повториться еще и не раз!
...
Рейтинг: 0 / 0
Поиск последовательности в бинарном массиве
    #39586730
rgreat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Няшик,

https://quality.embarcadero.com/browse/RSP-13687

Проголосуй.

Ну а пока - скопипасти если тебе быстрый x64 POS надо.
...
Рейтинг: 0 / 0
Поиск последовательности в бинарном массиве
    #39586731
rgreat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Bellic,

У функции POS есть 3-й, необязательный параметр.
Учи матчасть.
...
Рейтинг: 0 / 0
Поиск последовательности в бинарном массиве
    #39586732
Bellic
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Сам себе и отвечаю..)))
Видимо так?:
авторPosEx(SubStr, Str: String; Offset: Integer) - функция аналогична функции Pos(), но позволяет задать отступ от начала строки для поиска. Если значение Offset задано (оно не является обязательным), то поиск начинается с символа Offset в строке. Если Offset больше длины строки Str, то функция возратит 0. Также 0 возвращается, если подстрока не найдена в строке.
...
Рейтинг: 0 / 0
Поиск последовательности в бинарном массиве
    #39586733
Bellic
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
rgreatУ функции POS есть 3-й, необязательный параметр.
Учи матчасть.Учу и учюсь, rgreat , мог бы тогда и ссылку кинуть, пока только с двумя параметрами попадаются!..(
...
Рейтинг: 0 / 0
Поиск последовательности в бинарном массиве
    #39586734
rgreat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Начиная с Delphi XE3 у Pos - 3 параметра.
...
Рейтинг: 0 / 0
Поиск последовательности в бинарном массиве
    #39586757
SOFT FOR YOU
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Bellic,

Оптимизировать многое что можно
Ты уверен, что оно тебе нужно? )))
...
Рейтинг: 0 / 0
Поиск последовательности в бинарном массиве
    #39586759
SOFT FOR YOU
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Самая главная оптимизация - поиск первого байта. Есть алгоритм, позволяющий считывать сразу несколько байт, и искать первое вхождение за раз. В регистре x86 можно сравнивать сразу 4 байта. В x64 - 8. В SSE - 16. За одну итерацию.

Далее. Сравнение цепочки байт. Можно сравнивать не по одному, а до 16 байт за итерацию.

Ещё один подход применяют... при нахождении первого байта, сравнить ещё 2: тот что посередине, и тот что в конце. Это позволит избежать большинства ложных сравнивающих циклов.

Наконец, если заморочиться, можно делать SSE операции чтения, выровненные на 16 байт.
...
Рейтинг: 0 / 0
Поиск последовательности в бинарном массиве
    #39586763
Bellic
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
SOFT FOR YOUОптимизировать многое что можно
Ты уверен, что оно тебе нужно? )))Вопрос конечно не только практический, но даже Философский!..)))
Практически - вариант поиска и замены мне удобней всего в плане подготовки данных и дальнейших действий!
Но на реальных данных - не шибко быстрый...
...
Ну а философски - типа "Нафига оно тебе надо... позже или раньше - все Там будем?"
Так что ли?..)
Отвечу - вот Там то как раз и не нужно ничего будет!
А тут - уж пожалуйста, двигайся, ибо движение - это Жизнь! Люби и будь любимым! Бегай, прыгай, ходи в бассейн или загорай на солнышке! Потому, что ты человек! И т.д. и т.п.
Ход мыслей моих понятен?
...
А может у Вас есть реальное предложение?..)

А вот у меня - пожалуй есть Задачка для толкового Кодера-СИшника-Дельфина, только денег заплатить не шибко много могу!..))
(Естественно - подробности не тут! - И так ОффТопим много!)
...
Рейтинг: 0 / 0
Поиск последовательности в бинарном массиве
    #39586767
rgreat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Bellic,

Напиши в приват подробности.
...
Рейтинг: 0 / 0
Поиск последовательности в бинарном массиве
    #39586770
Bellic
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
rgreatНапиши в приват подробности.Пардон, но я Приватов тут не нахожу, разве что мыло в профиле
...
Рейтинг: 0 / 0
Поиск последовательности в бинарном массиве
    #39586771
SOFT FOR YOU
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Bellic,

Ну дерзай. Все возможные пути оптимизации я тебе назвал
...
Рейтинг: 0 / 0
Поиск последовательности в бинарном массиве
    #39586772
Bellic
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
SOFT FOR YOUНу дерзай. Все возможные пути оптимизации я тебе назвал
Спасибо!..))
RawByteString добью сначало - где то ошибку допустил и зациклился!

С КРЕЩЕНИЕМ, парни!!!
...
Рейтинг: 0 / 0
Поиск последовательности в бинарном массиве
    #39586841
white_nigger
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А что, алгоритмы группы BM для быстрого поиска уже отменили?
...
Рейтинг: 0 / 0
Поиск последовательности в бинарном массиве
    #39586847
kealon(Ruslan)
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
white_niggerА что, алгоритмы группы BM для быстрого поиска уже отменили?да вообще какой-то трындец
Алгоритм Кнута — Морриса — Пратта это же rocket science
...
Рейтинг: 0 / 0
Поиск последовательности в бинарном массиве
    #39586860
white_nigger
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
kealon(Ruslan) Алгоритм Кнута — Морриса — Пратта это же rocket scienceИ не говори. Не любят классиков, всё велосипед изобретают оптимизаторы, ля :)
...
Рейтинг: 0 / 0
25 сообщений из 270, страница 2 из 11
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Поиск последовательности в бинарном массиве
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]