Visual Basic, .NET, ASP, VBScript
 

   
   
     

Форум - Общий форум

Страница: 1 |

 

  Вопрос: Найти цепочку байт в диню.массиве Добавлено: 22.02.06 20:34  

Автор вопроса:  Alex | Web-сайт: metalosplav.ru
Имеется динамический массив большой размерности около 30-40mb в нем необходимо найти цепочку байт произвольно заданной длины. Как это сделать?
Заранее спасибо.

Ответить

  Ответы Всего ответов: 13  

Номер ответа: 1
Автор ответа:
 HOOLIGAN



Вопросов: 0
Ответов: 1066
 Профиль | | #1 Добавлено: 22.02.06 20:45
Если длина цепочки равна n, то начиная от первого байта массива, сравнивать n байт массива с искомой цепочкой. Если не совпало, сравниваем начиная со второго, третьего и т.д. байта массива.

Ответить

Номер ответа: 2
Автор ответа:
 Alex



Вопросов: 13
Ответов: 26
 Web-сайт: metalosplav.ru
 Профиль | | #2
Добавлено: 22.02.06 21:04
А как это осуществить программно. Если задвать в цикле придется минут 20-30 ждать если не больше пока он прверит. А мне желательно побыстрей бы.

Ответить

Номер ответа: 3
Автор ответа:
 ChemistN1



Вопросов: 7
Ответов: 43
 Web-сайт: snurs.narod.ru
 Профиль | | #3
Добавлено: 22.02.06 21:17
Если взять 1-й байт искомой цепочки и проверять начиная с 1-го байта массива, потом, если совпадет - со 2-м байтом иск. цеп-ки, итд, должно выйти намного быстрее.

Ответить

Номер ответа: 4
Автор ответа:
 HOOLIGAN



Вопросов: 0
Ответов: 1066
 Профиль | | #4 Добавлено: 22.02.06 21:29
Ну есть разные алгоритмы, типа Бойера-Мура, quick search и т.д.
Сходи на http://algolist.manual.ru там есть алгоритмы.
Я когда-то делал такой поиск, но на ассемблере. Получилось весьма быстро.
А на VB тут делать нечего.

Ответить

Номер ответа: 5
Автор ответа:
 HACKER


 

Разработчик Offline Client

Вопросов: 236
Ответов: 8362
 Профиль | | #5 Добавлено: 22.02.06 23:29
ну чё нечего :) долго просто будет... хотя и не факт что пол часа,
если шустрый алгоритм, вполне реально уложиться в минуту...

Ответить

Номер ответа: 6
Автор ответа:
 HOOLIGAN



Вопросов: 0
Ответов: 1066
 Профиль | | #6 Добавлено: 22.02.06 23:40
Минута - это очень много.

Ответить

Номер ответа: 7
Автор ответа:
 GSerg



Вопросов: 0
Ответов: 1876


 Профиль | | #7 Добавлено: 23.02.06 06:22
InStrB()

Ответить

Номер ответа: 8
Автор ответа:
 HOOLIGAN



Вопросов: 0
Ответов: 1066
 Профиль | | #8 Добавлено: 23.02.06 09:46
InStrB()

Медленно.

Ответить

Номер ответа: 9
Автор ответа:
 [root]



Вопросов: 45
Ответов: 1212
 Web-сайт: bit.pirit.info
 Профиль | | #9
Добавлено: 23.02.06 11:05

InStr Function
Returns a Variant(Long) specifying the position of the first occurence of one
string within another.

Syntax:
InStr([start,]string1, string2[,compare];)

The InStr function syntax has these arguments:
Part        ;Description
start       Optional. Numeric expression that sets the starting position for
each search. If omitted, search begins at the first character
position. If start contains Null, an error occurs. The start           argument
is requird if compare is specified.
string1     Required. String expression being searched.
string2     Required. String expression sought.
compare     Optional. Specifies the type of string comparison. If compare is
Null, an error occurs. If compare is omitted, the Option Compare
            setting determines the type of comparison. Specify a valid LCID
            ;(LocaleID) to use locale-specific rules in the comparison.

Settings
The comare argument settinga are:
Constant                Value   Description
vbUseComareOption       -1      Performs a comparison using the setting of the
Option Compare statement.
vbBinaryCompare         0       Performs a binary comparison.
vbTextCompare           1       Performs a textual comparison.
vbDataBaseCompare       2       Microsoft Access only. Performs a comparison
based on information in your database.

Return Values
If                              InStr returns
string1 is zero-length          0
string1 is Null                 Null
string2 is zero-length          start
string2 is Null                 Null
string2 is not found            0
string2 if found within string1 Position at which match is found

start > string2                 0

Remarks
The InStrB function is used with byte data contained in a string. Instead of
returning the character position of the first occurence of one string within
another, InstrB returns the byte position.


Ответить

Номер ответа: 10
Автор ответа:
 BUG(O)R



ICQ: 827887 

Вопросов: 13
Ответов: 142
 Web-сайт: hunger.ru
 Профиль | | #10
Добавлено: 23.02.06 12:11
Используй ассемблерные вставки. На ВБ такое действительно будет очень долго, а на асме можно уложиться в пару секунд секунды

Ответить

Номер ответа: 11
Автор ответа:
 HOOLIGAN



Вопросов: 0
Ответов: 1066
 Профиль | | #11 Добавлено: 23.02.06 12:34
InstrB() укладывается в 200 мс (для файла 30Мб и строки 16 байт)
На асме укладывается в 60 мс.

Ответить

Номер ответа: 12
Автор ответа:
 Alex



Вопросов: 13
Ответов: 26
 Web-сайт: metalosplav.ru
 Профиль | | #12
Добавлено: 23.02.06 23:03
Функция InStrB() сравнивает одну строку с другой. То есть мне надо сначала создать строку из этих байт и искать в ней. Примерно это будет выглядеть так сейчас нет под рукой установленного VB.
Do While m<=UBound(sData)
for i=n to m
строка=строка+Str(динамический_массив(i))
next i
Вхождение=InStrB(1,строка,строка_поиска)
if вхождение<>0 then
   MsgBox "Вхождение найдено"
else
   n=n+1
   m=n+Len(строка_поиска)
end if
Loop

Долго ведь получается. Если можно то приведите плиз какой нить рабочий пример.

Ответить

Номер ответа: 13
Автор ответа:
 HOOLIGAN



Вопросов: 0
Ответов: 1066
 Профиль | | #13 Добавлено: 23.02.06 23:57
При чем здесь строки?
Строки сравниваются при помощи InStr, а не InStrB.

Читаешь в массив свой файл, задаешь второй массив(искомая последовательность байт), и передаешь эти два массива в InStrB. Вот тебе рабочий пример:

    Dim ffree As Long
    Dim a() As Byte
    Dim s(0 To 15) As Byte
    Dim fsize As Long
    Dim t As Single
    ffree = FreeFile
    s(0) = &HB2
    s(1) = &H4D
    s(2) = &HB4
    s(3) = &H55
    s(4) = &H78
    s(5) = &HF9
    s(6) = &H1
    s(7) = &H8D
    s(8) = &H93
    s(9) = &H5B
    s(10) = &HAA
    s(11) = &H51
    s(12) = &H9E
    s(13) = &HA8
    s(14) = &H9E
    s(15) = &H38
    
    Open "C:\Program Files\Microsoft Visual Studio\MSDN\2001OCT\1033\PERIOD98.CHM" _
            For Binary As #1 'for binary access
    fsize = LOF(1)
    Debug.Print fsize
    ReDim a(0 To 33686956)
    Get #1, , a()
    t = Timer
    fsize = InStrB(1, a, s)
    t = Timer - t
    Debug.Print fsize
    Debug.Print t
    Close #1


Если время поиска порядка 200 мс (на средней машине) не устраивает - пишешь свою ф-цию.
Но судя по вопросу, вряд ли ты напишешь быстрее, чем InStrB.

Ответить

Страница: 1 |

Поиск по форуму



© Copyright 2002-2011 VBNet.RU | Пишите нам