PHP: подсчитать количество нулей перед строкой

Discussion in 'PHP' started by BlackRegulator, 18 Aug 2010.

  1. BlackRegulator

    BlackRegulator New Member

    Joined:
    14 Feb 2010
    Messages:
    6
    Likes Received:
    0
    Reputations:
    0
    Есть бинарная строка вида: 00 00 00 00 00 00 xx xx xx xx xx
    где xx какие то байты
    нужно узнать с какой позиции в строке начинаются ненулевые байты?
    важна скорость работы скрипта

    пока придумал нечто:
    - берем строку
    - удаляем нулевые байты вначале строки: ltrim
    - подсчитываем длину полученной строки
    - вычитаем полученную длину из длины исходной строки

    может есть более быстрый способ?
     
    #1 BlackRegulator, 18 Aug 2010
    Last edited: 18 Aug 2010
  2. Gar|k

    Gar|k Moderator

    Joined:
    20 Mar 2009
    Messages:
    1,166
    Likes Received:
    266
    Reputations:
    82
    $i=0;
    while($str[$i++]==0x00); // лень проверять можно ли так писать в php но в Си я бы сделал так
    echo $i+1;
     
    _________________________
  3. BlackRegulator

    BlackRegulator New Member

    Joined:
    14 Feb 2010
    Messages:
    6
    Likes Received:
    0
    Reputations:
    0
    это решение в лоб

    я бы хотел заюзать какие-нить встроенные функции, пересмотрел их - вроде все есть, но чего то не достает...

    хотя не знаю, нада тестить что быстрее...
     
  4. .::f-duck::.

    .::f-duck::. Member

    Joined:
    30 May 2009
    Messages:
    343
    Likes Received:
    32
    Reputations:
    7
    Напиши из этого ф-цию, будет "не в лоб".
    Или класс. Вообще по-хэнкерски будет.
     
    1 person likes this.
  5. WNZRS

    WNZRS Member

    Joined:
    3 Sep 2009
    Messages:
    294
    Likes Received:
    52
    Reputations:
    1
    PHP:
    $i=0;
    while(
    ord($str[$i++])==0);
    echo 
    $i+1;
     
  6. Gar|k

    Gar|k Moderator

    Joined:
    20 Mar 2009
    Messages:
    1,166
    Likes Received:
    266
    Reputations:
    82
    BlackRegulator ну ты ваще даешь ))
    ты хоть представляешь что происходит при вызове функции?
    ты думаешь во встроенной функции цикл какой-то другой? я не спорю что встроенная функция выполниться немного быстрей ее аналога на php так как она уже скомпилирована, а не интерпретируется, но как делаешь ты это еще медленнее обычного цикла )

    в общем пиши расширение php на ассемблере и будет тебе счастье )

    2 WNZRS строка бинарная!!! :)
     
    _________________________
  7. BlackRegulator

    BlackRegulator New Member

    Joined:
    14 Feb 2010
    Messages:
    6
    Likes Received:
    0
    Reputations:
    0

    я точно не представляю что происходит, но догадываюсь)
    я изхожу из предположения что обработка большого массива скриптом может быть медленней, из-за накладных расходов на интерпретацию, по сравнению, может быть с более медленными встроенными функциями, но которые вызываются всего один раз, если учесть что PHP не самый быстрый интерпретатор

    Если функция реализует нечто подобное:
    xor al,al
    repe scasb

    то она будет быстрей чем твой цикл
     
    #7 BlackRegulator, 18 Aug 2010
    Last edited: 18 Aug 2010
  8. roxblnfk

    roxblnfk Elder - Старейшина

    Joined:
    6 Feb 2010
    Messages:
    189
    Likes Received:
    42
    Reputations:
    19
    если у строки в начале не будет нулевого символа, то скрипт убьётся нахрен
    и ваше 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
     
    #8 roxblnfk, 19 Aug 2010
    Last edited: 19 Aug 2010
  9. Gar|k

    Gar|k Moderator

    Joined:
    20 Mar 2009
    Messages:
    1,166
    Likes Received:
    266
    Reputations:
    82
    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 :(
     
    _________________________
  10. Gifts

    Gifts Green member

    Joined:
    25 Apr 2008
    Messages:
    2,494
    Likes Received:
    807
    Reputations:
    614
    Gar|k верну вам веру в пхп: if ($str[$i]==="\x00")
    BlackRegulator плохо, когда кажется - если уж настолько критична скорость в этой задаче (вы собрались миллион файлов проверять?) - пишите свой модуль, или хотя бы демон на сях - но это извращение
     
    _________________________
  11. BlackRegulator

    BlackRegulator New Member

    Joined:
    14 Feb 2010
    Messages:
    6
    Likes Received:
    0
    Reputations:
    0
    serverside morphing

    я остановился все таки на:
    while ($BinaryData[$i++] == chr(0)); $i--;
     
  12. AdReNa1!Ne

    AdReNa1!Ne Elder - Старейшина

    Joined:
    24 May 2007
    Messages:
    70
    Likes Received:
    105
    Reputations:
    14
    Очень хочу спать, первый пост не читал, пишу по заголовку:
    Code:
    <?php
    $str = "0000000012345";
    $res = strlen($str)-strlen(intval($str));
    echo $res; // 8
    ?>
    
    // Gifts: в следующий раз отсыпайтесь и читайте
     
    #12 AdReNa1!Ne, 21 Aug 2010
    Last edited by a moderator: 21 Aug 2010
  13. BlackRegulator

    BlackRegulator New Member

    Joined:
    14 Feb 2010
    Messages:
    6
    Likes Received:
    0
    Reputations:
    0
     
  14. AdReNa1!Ne

    AdReNa1!Ne Elder - Старейшина

    Joined:
    24 May 2007
    Messages:
    70
    Likes Received:
    105
    Reputations:
    14
    Не спорю, я написал первое, что пришло в голову.