Сжатие строки с 32-х символьным алфавитом в 5 бит кодировку

Discussion in 'PHP' started by randman, 27 Jun 2013.

  1. randman

    randman Members of Antichat

    Joined:
    15 May 2010
    Messages:
    1,366
    Likes Received:
    610
    Reputations:
    1,101
    Понадобилось сделать такую штуковину, в гугле ничего не нашел, кода сделал пришла мысль что гораздо удобнее обойтись по другому, но не пропадать же этому:

    PHP:
        $str preg_replace('/[^a-z]/'''strtolower($str));
        
    $len strlen($str);
        
    $str $str."\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00";
        
    $out '';
    for(
    $i=0$i<$len; ++$i) {
        
    $str[$i] = ord($str[$i]) - 97;
    }
    for(
    $i=0$i<$len; ++$i) {
        
    $out .= chr(($str[$i] << 3) | (($str[++$i] & 0x1F) >> 2));
        
    $out .= chr(($str[$i] << 6) | (($str[++$i] & 0x1F) << 1) | (($str[++$i] & 0x1F) >> 4));
        
    $out .= chr(($str[$i] << 4) | (($str[++$i] & 0x1F) >> 1));
        
    $out .= chr(($str[$i] << 6) | (($str[++$i] & 0x1F) << 2) | (($str[++$i] & 0x1F) >> 3));
        
    $out .= chr(($str[$i] << 5) | ($str[++$i] & 0x1F));
    }
    $out rtrim($out"\x00");
    echo 
    $out
    Конечно можно было и улучшить убрав добавление лишних NULL-байтов, объединив все в одну строку, сразу применив & 0x1F ко всему(Может еще что забыл? :) Хотел-бы услышать), но использовать все равно не придется.
     
    #1 randman, 27 Jun 2013
    Last edited: 27 Jun 2013
  2. Gar|k

    Gar|k Moderator

    Joined:
    20 Mar 2009
    Messages:
    1,166
    Likes Received:
    266
    Reputations:
    82
    Ну просто поумничаю, так как не разобрал суть алгоритма :)

    strtolower выполнится первей чем preg_replace получается он выполниться для всей строки... оптимальнее (хотя для php это не критично) было бы сделать сначала preg_replace('/\W/','') а потом strtolower($str);

    P.S: Дааа, на Си это выглядело бы элегантнее
    http://c0dedgarik.blogspot.ru/2012/04/hex-2-bin.html
     
    _________________________