Есть бинарная строка вида: 00 00 00 00 00 00 xx xx xx xx xx где xx какие то байты нужно узнать с какой позиции в строке начинаются ненулевые байты? важна скорость работы скрипта пока придумал нечто: - берем строку - удаляем нулевые байты вначале строки: ltrim - подсчитываем длину полученной строки - вычитаем полученную длину из длины исходной строки может есть более быстрый способ?
$i=0; while($str[$i++]==0x00); // лень проверять можно ли так писать в php но в Си я бы сделал так echo $i+1;
это решение в лоб я бы хотел заюзать какие-нить встроенные функции, пересмотрел их - вроде все есть, но чего то не достает... хотя не знаю, нада тестить что быстрее...
BlackRegulator ну ты ваще даешь )) ты хоть представляешь что происходит при вызове функции? ты думаешь во встроенной функции цикл какой-то другой? я не спорю что встроенная функция выполниться немного быстрей ее аналога на php так как она уже скомпилирована, а не интерпретируется, но как делаешь ты это еще медленнее обычного цикла ) в общем пиши расширение php на ассемблере и будет тебе счастье ) 2 WNZRS строка бинарная!!!
я точно не представляю что происходит, но догадываюсь) я изхожу из предположения что обработка большого массива скриптом может быть медленней, из-за накладных расходов на интерпретацию, по сравнению, может быть с более медленными встроенными функциями, но которые вызываются всего один раз, если учесть что PHP не самый быстрый интерпретатор Если функция реализует нечто подобное: xor al,al repe scasb то она будет быстрей чем твой цикл
если у строки в начале не будет нулевого символа, то скрипт убьётся нахрен и ваше echo $i+1; надо заменить на $i-1; PHP: $str=chr(0).chr(0).'012345'; for($i=0,$j=strlen($str),$k=chr(0);$str{$i}===$k && $i<$j;$i++); echo $i; //2 2 Gar|k строка то бинарная, но 0x00 - не строка а число, поэтому сравнение строки с 0x00 (числом ноль) почти всегда будет давать true 'a'==0x00 // true 'fhmkkfj;;a8bt__++1'==0x00 // true ' '==0x00 // true chr(1)==0x00 // true '0'==0x00 // true '1'==0x00 // false
2 roxblnfk PHP: <?php // строка бинарная!!! $binarydata = pack ("C*",0,48); $binarydata.="привет"; echo 'binary: '.ord($binarydata[0]).'; ASCII: '.$binarydata[1].' = '.ord($binarydata[1]).'<br>'; $i=0; while(ord($binarydata[$i++])==0x00); // эх блин php нет в нем типа char... приходится преобразовывать echo --$i; ?> Мда разочаровался я в php
Gar|k верну вам веру в пхп: if ($str[$i]==="\x00") BlackRegulator плохо, когда кажется - если уж настолько критична скорость в этой задаче (вы собрались миллион файлов проверять?) - пишите свой модуль, или хотя бы демон на сях - но это извращение
Очень хочу спать, первый пост не читал, пишу по заголовку: Code: <?php $str = "0000000012345"; $res = strlen($str)-strlen(intval($str)); echo $res; // 8 ?> // Gifts: в следующий раз отсыпайтесь и читайте