Форум: Форум PHPФорум ApacheФорум Регулярные ВыраженияФорум MySQLHTML+CSS+JavaScriptФорум FlashРазное
Новые темы: 0000000
PHP на примерах (2 издание). Авторы: Кузнецов М.В., Симдянов И.В. PHP. Практика создания Web-сайтов (второе издание). Авторы: Кузнецов М.В., Симдянов И.В. MySQL на примерах. Авторы: Кузнецов М.В., Симдянов И.В. Объектно-ориентированное программирование на PHP. Авторы: Кузнецов М.В., Симдянов И.В. C++. Мастер-класс в задачах и примерах. Авторы: Кузнецов М.В., Симдянов И.В.
ВСЕ НАШИ КНИГИ
Консультационный центр SoftTime

Выбрать другой форум

 

Здравствуйте, Посетитель!

вид форума:
Линейный форум (новые сообщения вниз) Структурный форум

тема: Ответ 001 на задачу N 22

Сообщения:  [1-10]    [11-20]  [21-29] 

 
 автор: Eugene77   (20.08.2007 в 21:56)   письмо автору
 
   для: Trianon   (20.08.2007 в 07:08)
 

>пока что единственный опубликованный вариант, который не лажает на тестах, основан на трюке с переменной системой счисления (основание дрожит между 84 и 85). Для микроконтроллерной реализации ответного интерфейса - это роскошь на грани (а то и за гранью) фола.
>
Это мне непонятно. Что вы сказали? Вы говорите про мой вариант программы или про свой?
Вы тестировали мой вариант?
Что значит "дрожжит"
>
>Тестирующие скрипты опубликованы. Какая разница, кто запустит?
>
Ну я например проглядел у себя ошибку уже два раза. Хорошо бы протестировать мой скрипт
серьёзненько!

А вообще у меня наклёвывабтся некие идеи иного подхода к решению. Недавно, например
прочитал про pack(). Кажется ей можно многое упростить, но хорошо бы где-то добыть примеров её использования, а то я не совсем понял детали использования из мануала.
Незнаю ещё допустите ли вы её к использованию.
Да и пока времени маловато.
>>Интересно было бы узнать реальную разницу в скорости под юниксом всех трёх действующих вариантов. Стоило ли копья ломать?!
>
>Однозначно - из-за скорости - нет.

   
 
 автор: Trianon   (20.08.2007 в 07:08)   письмо автору
 
   для: Eugene77   (13.08.2007 в 18:49)
 

>Нравится мне ваша загадочность...
>Хоть и похоже немного на детский сад, но я купился...
какие загадки?
пока что единственный опубликованный вариант, который не лажает на тестах, основан на трюке с переменной системой счисления (основание дрожит между 84 и 85). Для микроконтроллерной реализации ответного интерфейса - это роскошь на грани (а то и за гранью) фола.


>Может ещё подумаю...
>Жаль, времени маловато: тема-то немного в сторонке лежит от моих задач...
>А то вообще-то и самому хочется по-человечески код переписать.
>
>Тестировать-то будете?
Тестирующие скрипты опубликованы. Какая разница, кто запустит?

>Интересно было бы узнать реальную разницу в скорости под юниксом всех трёх действующих вариантов. Стоило ли копья ломать?!

Однозначно - из-за скорости - нет.

   
 
 автор: Eugene77   (13.08.2007 в 18:49)   письмо автору
 
   для: Trianon   (13.08.2007 в 11:27)
 

>
>А идеальный ответ вакантен.
>Его так никто и не прислал.
>В том числе и я.

Нравится мне ваша загадочность...
Хоть и похоже немного на детский сад, но я купился...
Может ещё подумаю...
Жаль, времени маловато: тема-то немного в сторонке лежит от моих задач...
А то вообще-то и самому хочется по-человечески код переписать.

Тестировать-то будете?
Интересно было бы узнать реальную разницу в скорости под юниксом всех трёх действующих вариантов. Стоило ли копья ломать?!

   
 
 автор: Trianon   (13.08.2007 в 11:27)   письмо автору
 
   для: Eugene77   (12.08.2007 в 20:11)
 

Могу сказать, почему Ваш ответ проигнорировал я.
Я не считаю gmp инструментом, валяющимся на дороге, априори доступным в любой исполнительной среде, либо пакетом на раз реализующимся из элементарных операций.
Так что оценивать было нечего.

А идеальный ответ вакантен.
Его так никто и не прислал.
В том числе и я.

   
 
 автор: sim5   (12.08.2007 в 22:46)   письмо автору
 
   для: Eugene77   (12.08.2007 в 20:11)
 

Задача была интересная, но в ее начале упоминался и микроконтроллер. Бедный микроконтроллер - придеться ему изрядно попотеть :)

   
 
 автор: Unkind   (12.08.2007 в 22:13)   письмо автору
 
   для: Eugene77   (12.08.2007 в 20:11)
 

Возможно ли придумать задачу, касающуюся темы защиты от ftp троянов?
Я думаю придумать возможно всегда. Но вот такая тема как защита от троянов, ворующих FTP-пароли для PHP-форума не подходит.
Да и вообще для обычной задачи не подойдет. Нужно иметь ну уж хотя бы базу хешей исполняемых файлов или библиотек, содержащих троян.

   
 
 автор: Eugene77   (12.08.2007 в 20:11)   письмо автору
 
   для: Eugene77   (24.06.2007 в 21:34)
 

Привет всем!
Я, наконец, вернулся домой. Наверно упустил много интересного!
Буду навёрстывать.
Как жаль, что Трианон опубликовал своё решение прежде меня, но вот и мой вариант, на скорую руку залатанный. Признаться, латал скрепя сердцем – вся красота потерялась. Стало всё ужасно запутанно. Хотя после месяца проведенного в палатке, когда даже сотового телефона не было рядом, - это пустяки – у любого получится такую задачку решить.
В принципе идея простая – если не хватает места в четырёх байтах, то добавляем ещё два вспомогательных интеджера. Излишки – кидаем туда. Но всё это оборачивается кучей условных операторов, так что, конечно, мне до Трианоновой ясности мысли далеко, даже после такого славного проветривания мозгов, какое мне досталось.



// Функция user_encode во внешнем цикле разбивает входную строку на четвёрки байтов
// В первом вложенном цикле проверяет не короче ли остаток строки четырёх байтов и,
// если надо, уменьшает значение параметра $k до реальной длины остатка.
// Во втором цикле преобразует четвёрку байтов (квартет) в целое число
// В третьем вложенном цикле "while" приходится выравнивать содержимое неполных четвёрок к началу четвёрки быйтов
// Эта дань прихоти заказчика желающего сравнивать закодированные строки (сравнение строк начинается с первых байтов)
// В четвёртом цикле пора, наконец, привести число к 85-ричной системе исчислеия. (52200625 === 85*85*85*85)
// Число необходимых байт возрастает при этом на один ($pentet)
// Можно было бы сделать короче и изящнее, но условие сраниваемости строк накладывает жёсткие рамки на алгоритм.



f
unction user_encode($data, $abc) {
$patch = (127<<24)+(255<<16)+(255<<8)+255;
$abc=bubble($abc);
 for($resalt = "", $i=0; ($kvartet=substr($data, $i, 4)) != NULL;  $i+=4){
        for($k=4; $kvartet[$k-1] == NULL; $k--);
echo"k=    ".$k.'</br>';
        for($bin_kvartet=ord($kvartet[0]), $j=0; $j<$k; $j++) {
            if(($bin_kvartet=($bin_kvartet<<8))>= 0){
                if($patch-$bin_kvartet >= ord($kvartet[$j])){$bin_kvartet+=ord($kvartet[$j]); $add=0; $addrem = 0;}
                else {$bin_kvartet=$bin_kvartet-$patch+ord($kvartet[$j]); $add=$patch; $addrem = 0;}
                }
            else{
                 $bin_kvartet=($bin_kvartet ^ (128<<24));
                 $bin_kvartet += ord($kvartet[$j]);
                 $add=$patch; $addrem = 1;
                 }
        }
        while($j++ < 4)  {
            if(($bin_kvartet=($bin_kvartet<<8))>= 0){
                if($patch-$bin_kvartet >= ord($abc[84])){$bin_kvartet+=ord($abc[84]); $add=0; $extr = 0;}
                else {$bin_kvartet=$bin_kvartet-$patch+ord($abc[84]); $add=$patch; $extr = 41;}
                }
            else{
                 $bin_kvartet=($bin_kvartet ^ (128<<24));
                 $bin_kvartet += ord($abc[84]);
                 $add=$patch; $extr = 41; $addrem = 1;
                 }
        }
echo "encode summ  ".gmp_strval(gmp_add(gmp_add($bin_kvartet,$add),$addrem))."</br>";
        $d=52200625;
        $index = 0;
        if($add>0) $index++;
        for(; ($bin_kvartet - $index*$d + $add + $addrem) >= 0; $index++) $remnant = $bin_kvartet - $index*$d + $add + $addrem;

           $d /= 85;
           $pentet = $abc[--$index];

        for($j=1; $j<=$k; $d /= 85, $j++){
            $remnant2 = $remnant%$d;
            $index = ($remnant-$remnant2)/$d;
           if($index > 84) $index /= 85;
            $remnant = $remnant2;
            $pentet .= $abc[$index];
         }


    $resalt .= $pentet;
 }
return $resalt;
}

// Функция user_decode состоит из четырёх циклов в теле основного цикла,
// разбивающего входной поток на пятёрки байтов.
// В начале проверяется, действительно ли это пятёрка, и корректируется параметром $k, если надо
// Задача второго цикла - получить из пятёрки байтов входного потока целое число
// Для этого достаточно лишь просуммировать байты с соответствующими их положению весами.
// Третий цикл "while", опять же, выравнивающий. Возник лишь из-за условия сравниваемости кодированных строк, не более.
// Четвёртый цикл выделяет отдельные байты из целого числа и преобразует их в буквы.

function user_decode($text, $abc){
$abc=bubble($abc);
$patch = (127<<24)+(255<<16)+(255<<8)+255;

for($resalt = "", $i=0; $pentet=substr($text, $i, 5);  $i+=5){
    for($k=5; $pentet == substr($text, $i, $k-1); $k--);
    for($bin_kvartet=0, $j=0; $j<4; $j++){
        if($j < $k) $pos = strpos($abc, $pentet[$j]);
        else  $pos = 0;
        $bin_kvartet = $bin_kvartet*85+$pos;
    }

    if(4 < $k) $pos = strpos($abc, $pentet[4]);
    else  $pos = 0;
    $remnant = ($patch-$pos)%85;
    if(($patch-$remnant)/85 >= $bin_kvartet) { // Первый бит будет нулём (маленькое число)
            $bin_kvartet = $bin_kvartet*85+$pos;
        for($kvartet = "", $j=24; $j>=8*(5-$k); $j -= 8){
            $digit = $bin_kvartet>>$j;
            $bin_kvartet -= $digit<<$j;
            $kvartet .= chr($digit);
        }
    }
    else{  // Первый бит хочет стать единичкой. Надо решать проблему этого знакового бита
        $remnant = $patch%85;
        $quotient = ($patch-$remnant)/85;
        $bin_kvartet = ($bin_kvartet-$quotient)*85-43+$pos;
        $digit = ($bin_kvartet>>24)+128;
        $kvartet = chr($digit);
        $bin_kvartet -= (($digit-128)<<24);

        for($j=16; $j>=8*(5-$k); $j -= 8){
            $digit = $bin_kvartet>>$j;
            $bin_kvartet -= $digit<<$j;
            $kvartet .= chr($digit);
        }
     }
$resalt .= $kvartet;
}
return $resalt;
}

function user_decode_gmp($text, $abc){
$abc=bubble($abc);

for($resalt = "", $i=0; $pentet=substr($text, $i, 5);  $i+=5){
    for($k=5; $pentet == substr($text, $i, $k-1); $k--);
    for($bin_kvartet=gmp_init(0), $j=0; $j<$k; $j++){
        $pos = strpos($abc, $pentet[$j]);
        $bin_kvartet = gmp_add(gmp_mul($bin_kvartet,85),$pos);
    }
    while($j++<5) $bin_kvartet = gmp_mul($bin_kvartet,85);
    for($kvartet = "", $j=16777216 , $t=1; $t<$k; $j /= 256, $t++){
        $digit = gmp_div($bin_kvartet,(int)$j);
        $bin_kvartet = gmp_sub($bin_kvartet,gmp_mul($digit,$j));
        $kvartet .= chr(gmp_intval($digit));
    }
$resalt .= $kvartet;
}
return $resalt;
}


Кстати, попутно нашёл ошибочку и в своей функции кодирования посредством gmp библиотеки. Её следует переделать до вот такого состояния:


function user_gmp_encode($data, $abc) {
$abc=bubble($abc);
for($resalt = "", $i=0; ($kvartet=substr($data, $i, 4)) != NULL;  $i+=4){
    for($k=4; $kvartet[$k-1] == NULL; $k--);
    for($bin_kvartet=gmp_init(0), $j=0; $j<$k; $j++) $bin_kvartet=gmp_add(gmp_mul($bin_kvartet,256),ord($kvartet[$j]));
    while($j++ < 4) $bin_kvartet=gmp_add(gmp_mul($bin_kvartet,256),ord($abc[84]));
 echo"gmp_bin_kvartet = ".gmp_strval($bin_kvartet)."</br>";
    for($pentet = "", $j=0, $d=52200625, $remnant = $bin_kvartet; $j<=$k; $j++, $d /= 85){
        $index = gmp_div_q($remnant, $d);
        $remnant = gmp_div_r($remnant,$d);
        $pentet .= $abc[gmp_intval ($index)];
    }
    $resalt .= $pentet;
}
return $resalt;
}


Ну и, с нетерпением жду следующую задачку!

Возможно ли придумать задачу, касающуюся темы защиты от ftp троянов?

   
 
 автор: Eugene77   (28.06.2007 в 09:34)   письмо автору
 
   для: cheops   (28.06.2007 в 00:26)
 

Ага! Понятно! Вы меня с кем-то другим перепутали.
Вот почему мне наш диалог таким странным показался!

Я не сдавал решения в срок.
А сейчас, уже посмотрев как делали другие, написал некий свой вариант, как мне кажется разумным такую задачу решать.

Может он и не очень разумный, тогда в чём? Подскажите!
Я положу сейчас свой вариант решения в виде отдельной темы.
Конечно, я не претендую на полноправие своего решения, в нём присутствуют элементы прямо подцепленные из других ответов, но не всё там чужое. Надеюсь, кто-нибудь протестирует моё решение и даст совет.

   
 
 автор: cheops   (28.06.2007 в 00:26)   письмо автору
 
   для: Eugene77   (27.06.2007 в 22:33)
 

>Разве есть такие функции в PHP?
>Я знаю пока только strlen(). Где прочитать?
А разве вы PHP-функцию использовали? Вы воспользовались MySQL-функцией :)))
<?php
  $sql 
"SELECT *, LENGTH(guestname) as len FROM guests WHERE id = ".intval($id);
?>

   
 
 автор: Eugene77   (27.06.2007 в 22:33)   письмо автору
 
   для: cheops   (27.06.2007 в 16:21)
 

>Да есть такое дело, функция LENGTH() - возвращает количество байт в строке, для того, чтобы >получить количество символов (в том числе и для двухбайтовых кодировок), правильнее >использовать функцию CHAR_LENGTH().

Разве есть такие функции в PHP?
Я знаю пока только strlen(). Где прочитать?

>Здесь не совсем корректно это обсуждать, так как вы не привели свой файл config.inc.php - не >известно, как вы настраиваете кодировку соединения. Поэтому по умолчанию действует >презумция невиновности :) - вы использовали однобайтовую кодировку и с проблемой >удвоения не столкнулись, следовательно с ней не столкнётся и пользователь скрипта.
>

А магические кавычки тоже по умолчанию выключенными считать? :-)


>PS Вопросы, посвящённые предыдущей задаче, лучше обсуждать в темах, посвящённых предыдущей задаче. Другие посетители, которые будут решать задачу позже, возможно тоже заинтересуются всеми аспектами задачи и им тоже интересно почитать обсуждение, а так они будут вынуждены искать это обсуждение по всему форуму.

То есть мне создать новую тему: Решение задачи 21 № 7, внести туда своё решение, и там продолжим? Правильно я понял?

   

Сообщения:  [1-10]    [11-20]  [21-29] 

Форум разработан IT-студией SoftTime
Rambler's Top100
вверх

Rambler's Top100 Яндекс.Метрика Яндекс цитирования