|
|
|
|
|
для: Trianon
(20.08.2007 в 07:08)
| | >пока что единственный опубликованный вариант, который не лажает на тестах, основан на трюке с переменной системой счисления (основание дрожит между 84 и 85). Для микроконтроллерной реализации ответного интерфейса - это роскошь на грани (а то и за гранью) фола.
>
Это мне непонятно. Что вы сказали? Вы говорите про мой вариант программы или про свой?
Вы тестировали мой вариант?
Что значит "дрожжит"
>
>Тестирующие скрипты опубликованы. Какая разница, кто запустит?
>
Ну я например проглядел у себя ошибку уже два раза. Хорошо бы протестировать мой скрипт
серьёзненько!
А вообще у меня наклёвывабтся некие идеи иного подхода к решению. Недавно, например
прочитал про pack(). Кажется ей можно многое упростить, но хорошо бы где-то добыть примеров её использования, а то я не совсем понял детали использования из мануала.
Незнаю ещё допустите ли вы её к использованию.
Да и пока времени маловато.
>>Интересно было бы узнать реальную разницу в скорости под юниксом всех трёх действующих вариантов. Стоило ли копья ломать?!
>
>Однозначно - из-за скорости - нет. | |
|
|
|
|
|
|
|
для: Eugene77
(13.08.2007 в 18:49)
| | >Нравится мне ваша загадочность...
>Хоть и похоже немного на детский сад, но я купился...
какие загадки?
пока что единственный опубликованный вариант, который не лажает на тестах, основан на трюке с переменной системой счисления (основание дрожит между 84 и 85). Для микроконтроллерной реализации ответного интерфейса - это роскошь на грани (а то и за гранью) фола.
>Может ещё подумаю...
>Жаль, времени маловато: тема-то немного в сторонке лежит от моих задач...
>А то вообще-то и самому хочется по-человечески код переписать.
>
>Тестировать-то будете?
Тестирующие скрипты опубликованы. Какая разница, кто запустит?
>Интересно было бы узнать реальную разницу в скорости под юниксом всех трёх действующих вариантов. Стоило ли копья ломать?!
Однозначно - из-за скорости - нет. | |
|
|
|
|
|
|
|
для: Trianon
(13.08.2007 в 11:27)
| | >
>А идеальный ответ вакантен.
>Его так никто и не прислал.
>В том числе и я.
Нравится мне ваша загадочность...
Хоть и похоже немного на детский сад, но я купился...
Может ещё подумаю...
Жаль, времени маловато: тема-то немного в сторонке лежит от моих задач...
А то вообще-то и самому хочется по-человечески код переписать.
Тестировать-то будете?
Интересно было бы узнать реальную разницу в скорости под юниксом всех трёх действующих вариантов. Стоило ли копья ломать?! | |
|
|
|
|
|
|
|
для: Eugene77
(12.08.2007 в 20:11)
| | Могу сказать, почему Ваш ответ проигнорировал я.
Я не считаю gmp инструментом, валяющимся на дороге, априори доступным в любой исполнительной среде, либо пакетом на раз реализующимся из элементарных операций.
Так что оценивать было нечего.
А идеальный ответ вакантен.
Его так никто и не прислал.
В том числе и я. | |
|
|
|
|
|
|
|
для: Eugene77
(12.08.2007 в 20:11)
| | Задача была интересная, но в ее начале упоминался и микроконтроллер. Бедный микроконтроллер - придеться ему изрядно попотеть :) | |
|
|
|
|
|
|
|
для: Eugene77
(12.08.2007 в 20:11)
| | Возможно ли придумать задачу, касающуюся темы защиты от ftp троянов?
Я думаю придумать возможно всегда. Но вот такая тема как защита от троянов, ворующих FTP-пароли для PHP-форума не подходит.
Да и вообще для обычной задачи не подойдет. Нужно иметь ну уж хотя бы базу хешей исполняемых файлов или библиотек, содержащих троян. | |
|
|
|
|
|
|
|
для: 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 троянов? | |
|
|
|
|
|
|
|
для: 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);
?>
|
| |
|
|
|
|
|
|
|
для: cheops
(27.06.2007 в 16:21)
| | >Да есть такое дело, функция LENGTH() - возвращает количество байт в строке, для того, чтобы >получить количество символов (в том числе и для двухбайтовых кодировок), правильнее >использовать функцию CHAR_LENGTH().
Разве есть такие функции в PHP?
Я знаю пока только strlen(). Где прочитать?
>Здесь не совсем корректно это обсуждать, так как вы не привели свой файл config.inc.php - не >известно, как вы настраиваете кодировку соединения. Поэтому по умолчанию действует >презумция невиновности :) - вы использовали однобайтовую кодировку и с проблемой >удвоения не столкнулись, следовательно с ней не столкнётся и пользователь скрипта.
>
А магические кавычки тоже по умолчанию выключенными считать? :-)
>PS Вопросы, посвящённые предыдущей задаче, лучше обсуждать в темах, посвящённых предыдущей задаче. Другие посетители, которые будут решать задачу позже, возможно тоже заинтересуются всеми аспектами задачи и им тоже интересно почитать обсуждение, а так они будут вынуждены искать это обсуждение по всему форуму.
То есть мне создать новую тему: Решение задачи 21 № 7, внести туда своё решение, и там продолжим? Правильно я понял? | |
|
|
| |
|