Бинарный файл и регулярные выражения

mig82

Новичок
Бинарный файл и регулярные выражения

У меня есть бинарный файлик, в нем есть много таких кусочков.

00 00 00 18 │ 80 00 00 04 │ 00 00 00 00 │ 00 00 A6 74 │ 38 32 39 32 | 61 31 32 00

Из каждого нужно выдирать "00 00 A6 74" и "38 32 39 32 61 31 32". Эти части меняются.

А эти не меняются "80 00 00 04 00 00 00 00"

пишу такое выражение, а оно не работает :(

preg_match_all('/.*.{4}[\x08\x00\x00\x04\x00\x00\x00\x00](.{4})(.+)\x00.*/'
 

whirlwind

TDD infected, paranoid
.*

вот этот кусок отожрет все
почитай про квантификаторы
 

mig82

Новичок
whirlwind

Если ты говорил про последний .* то у меня могут быть а могут и не быть данные после .*
Перепробовал я уже многое, но что-то толку ноль.
 

whirlwind

TDD infected, paranoid
я говорю про первый

-~{}~ 08.02.06 15:33:

и это

[\x08\x00\x00\x04\x00\x00\x00\x00]

символизирует один символ, а не последовательность. с какой стати задано классом?
 

white phoenix

Новичок
PHP:
function hecho($string) {return preg_replace('#.#se','sprintf("\\x%02x",ord("$0"))',$string);}
$string = "\x00\x00\x00\x18\x80\x00\x00\x04\x00\x00\x00\x00\x00\x00\xA6\x74\x38\x32\x39\x32\x61\x31\x32\x00";
$pattern = '~.{4}'.'\x80\x00\x00\x04'.'\x00\x00\x00\x00'.'(.{4})([^\x00]+)~s';
$result = preg_match_all($pattern,$string,$matches,PREG_SET_ORDER);
foreach($matches as $s=>$m)
{
 foreach($m as $k=>$b) {echo '['.$s.']['.$k.']'.' = '.hecho($b).';'."\n";}
}
/*
[0][0] = \x00\x00\x00\x18\x80\x00\x00\x04\x00\x00\x00\x00\x00\x00\xa6\x74\x38\x32\x39\x32\x61\x31\x32\x00;
[0][1] = \x00\x00\xa6\x74;
[0][2] = \x38\x32\x39\x32\x61\x31\x32\x00;
*/
UPD: мусье добавил условие
 

white phoenix

Новичок
mig82
И еще... у тебя файл состоит только из таких фрагментов? Или среди кучи ненужного встречаются? Если первое, то рег. выражения тут не нужны, всё решается строковыми функциями, а если второе, то см. пример выше.
whirlwind
> "/\x08\x00{2}\x04\x00{4}(.{11})\x00/"
Как минимум забыл модификатор 's'. И выражение не то.
 

mig82

Новичок
white phoenix

кучка мусора. причем после 00 00 A6 74 может быть любое кол-во данных, заканчивающихся 0x00
 

whirlwind

TDD infected, paranoid
white phoenix
все там правильно

$s = "\x00\x00\x00\x18\x80\x00\x00\x04\x00\x00\x00\x00\x00\x00\xA6\x74\x38\x32\x39\x32\x61\x31\x32\x00";
echo (preg_match('/\x80\x00{2}\x04\x00{4}(.{11})\x00/',$s,$match) ? "" : "not ")."found\n";
var_dump($match);

-~{}~ 08.02.06 15:59:

mig82

под твой случай немного видоизменить просто

/\x80\x00{2}\x04\x00{4}([^\x00]+)/

PS. ну и /s на всякий пожарный добавить от 0A 0D
 
Сверху