0101 1000 0001 0000 010 - не является частью поиска 1 1000 0001 0000 - это число нужно искать каков алгоритм поиска? Брать два байта и сравнивать их со значениями которые вообще могут сложиться из неизменной второй части в 13 бит и изменяемой первой в 3 бита? то есть 58 10 - удовлетворяет условию.. 18 10 38 10 78 10 и так далее - все нечётные первые 4 бита..... и что каждые два байта сравнивать всегда с восемью значениями??? Нет более быстрого и умного решения???
А если нам надо найти 1000 0001 или 1000 0001 0, или еще что нибудь? Блин возник вопрос, создам отдельной темой.
Никакой разницы. Мы просто применяем AND к обоим операндам с маской, в которой интересующие нас биты установлены в 1 и сравниваем их без задней мысли. Или можно сдвиг влево использовать на число не интересующих нас бит и затем сравнивать.
Вынимаю видеоряд из .mts Загрузил в память исходный файл и открыл новый... Код (ASM): mov ebx,[HeapAllocMem] mov esi,[FileSizeIn] xor edi,edi mov edi,5 ;файл состоит из пакетов по 192 байта, начинается сразу без заголовков sub esi,5 ;нужный пакет видео закодирован в 2 байтах каждого пакета по смещению 5 .cikl: mov ax,[ebx+edi] mov [all],al mov [ahh],ah mov al,[ahh] mov ah,[all] and ax,$1200 xor ax,$1200 jnz .vpered xor ecx,ecx mov ecx,ebx add ecx,edi sub ecx,5 invoke WriteFile,[FileOut],ecx,$0c0,cbWrite,0 test eax,eax je .errWriteFile add edi,$0c0 sub esi,$0c0 cmp esi,$0c0 jae .cikl jmp .close .vpered: add edi,$0c0 sub esi,$0c0 cmp esi,$0c0 jae .cikl .close: Как можно окультурить?
Код (ASM): mov ebx,[HeapAllocMem] mov esi,[FileSizeIn] mov edi, 5 sub esi, 5 .next_packet: mov ax,[ebx+edi] rol ax, 8 and ax,$1200 xor ax,$1200 jnz .skip_packet lea ecx, [ebx+edi-5] invoke WriteFile,[FileOut],ecx,$0c0,cbWrite,0 test eax,eax jz .errWriteFile .skip_packet: add edi,$0c0 sub esi,$0c0 cmp esi,$0c0 jae .next_packet
rmn, Спасибо.... Тут вот ещё какая хрень..... Если в 2 ух байтах мне надо смотреть маску 0000 0000 0000 0001 ... то почти любые значения будут якобы удовлетворять поиску а на самом деле хрень! пусть имеем в регистре 0001 1111 0011 0011 ... после and получаем вроде бы то что надо 0000 0000 0000 0001 .... и xor скажет что у вас удовлетворяет поиску... а на самом то деле нет... Или что не так думаю?
Не точно сказал. Проверяются 13 бит в каждой паре байт. Первые три бита не проверяем. Тогда нужно найти по маске ***0 0000 0000 0001 .. Если в регистре к примеру такие значения байт - 0001 1111 0011 0011 , то по маске 0000 0000 0000 0001 and создаст в регистре значение равное маске. Что искажает требуемый результат. Как можно сделать чтобы любое значение 13 бит можно было бы находить в 2 байтах, в которых первые 3 бита могут быть любыми?
Код (ASM): mov ebx,[HeapAllocMem] mov esi,[FileSizeIn] xor edi,edi mov edi,5 sub esi,5 .cikl: mov ax,[ebx+edi] rol ax,8 btr ax,15 btr ax,14 btr ax,13 xor ax,$1011 jnz .vpered lea ecx,[ebx+edi-5] invoke WriteFile,[FileOut],ecx,$0c0,cbWrite,0 test eax,eax jz .errWriteFile .vpered: add edi,$0c0 sub esi,$0c0 cmp esi,$0c0 jae .cikl .close: так по ходу надёжнее....