vika
|
|
« : 07-03-2013 02:42 » |
|
Собственно, здравствуйте. Не буду излишне флудить, сразу изложу свою проблему. Собственно, есть код на яваскрипте, определенным образом пакующий строку... function pack(a, b) { V = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-_"; var c = "", d = "", e, f, g, h, k, p = 0; b &= 255; for (f = 0; f < a.length; d += String.fromCharCode(b ^ a.charCodeAt(f)), f++); for (a = d; p < a.length;) e = a.charCodeAt(p++), d = a.charCodeAt(p++), f = a.charCodeAt(p++), g = e >> 2, e = (e & 3) << 4 | d >> 4, h = (d & 15) << 2 | f >> 6, k = f & 63, isNaN(d) ? h = k = 64 : isNaN(f) && (k = 64), c = c + V.charAt(g) + V.charAt(e) + V.charAt(h) + V.charAt(k); return c }; И, попытка реализовать подобное на Perl #!/usr/bin/perl
$a = '' # тут строка;
$b = '' # тут число, от которого мы пляшем;
$V = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-_";
$c, $d;
$e, $f, $g, $h, $k, $p = 0;
$b &= 255;
for ($f = 0; $f < length $a; $d .= chr($b ^ ord(substr($a, $f))), $f++){}
for ($a = $d; $p < length $a;) {
$e = ord(substr($a, $p++));
$d = ord(substr($a, $p++));
$f = ord(substr($a, $p++));
$g = $e >> 2;
$e = ($e & 3) << 4 | $d >> 4;
$h = ($d & 15) << 2 | $f >> 6;
$k = $f & 63;
if ($d != $d) {
$h = $k = 64
} elsif ($f != $f) {
$k = 64}
$c = $c.substr($V, $q, 1).substr($V, $e, 1).substr($V, $h, 1).substr($V, $k, 1)}
print $c; Ткните носом, где косяк??? Подозреваю, что из за особенности работы perl с utf8. Правильно ли реализовала функцию isnan яваскрипта? Беда в том, что результаты кодирования для некоторых строк на яваскрипте и perl заметно отличаются. Собственно, пожалуйста помогите.
|
|
« Последнее редактирование: 08-03-2013 14:24 от McZim »
|
Записан
|
|
|
|
RXL
Технический
Администратор
Offline
Пол:
|
|
« Ответ #1 : 07-03-2013 05:41 » |
|
vika, у меня два предложения для улучшения темы и ускорения решения твоей задачи: 1. Отформатировать код для повышения читаемости. 2. Указать в [code] язык для включения подсветки. [code=javascript] и [code=perl] соответственно. Заметь, о безобразиях синтаксиса еще не ни слова.
|
|
« Последнее редактирование: 08-03-2013 14:25 от McZim »
|
Записан
|
... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
|
|
|
Sla
|
|
« Ответ #2 : 07-03-2013 08:44 » |
|
function pack(a, b) { V = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-_"; var c = "", d = "", e, f, g, h, k, p = 0; b &= 255; for (f = 0; f < a.length; d += String.fromCharCode(b ^ a.charCodeAt(f)), f++); for (a = d; p < a.length;) e = a.charCodeAt(p++), d = a.charCodeAt(p++), f = a.charCodeAt(p++), g = e >> 2, e = (e & 3) << 4 | d >> 4, h = (d & 15) << 2 | f >> 6, k = f & 63, isNaN(d) ? h = k = 64 : isNaN(f) && (k = 64), c = c + V.charAt(g) + V.charAt(e) + V.charAt(h) + V.charAt(k); return c }; Да за такой код нужно убивать С одной стороны - он рабочий а с другой не читаем для сопровождения и не оптимален по времени выполнения, зато, с другой стороны, оптимален количестом символов - потому что пропущен через обфускатор var a_lenght = a.length; //эта переменная нам еще понадобится for (f = 0; f < a_length; f++) { d += String.fromCharCode(b ^ a.charCodeAt(f)); } for (a = d; p < a_length;) { e = a.charCodeAt(p++); d = a.charCodeAt(p++); f = a.charCodeAt(p++); g = e >> 2; e = (e & 3) << 4 | d >> 4; h = (d & 15) << 2 | f >> 6; k = f & 63; isNaN(d) ? h = k = 64 : isNaN(f) && (k = 64); c = c + V.charAt(g) + V.charAt(e) + V.charAt(h) + V.charAt(k); } А теперь такой код проще перевести на любой язык Добавлено через 7 минут и 13 секунд:Что из себя представляет isNaN? > особенности работы perl с utf8 Что за осбенности?
|
|
« Последнее редактирование: 07-03-2013 08:51 от Sla »
|
Записан
|
Мы все учились понемногу... Чему-нибудь и как-нибудь.
|
|
|
RXL
Технический
Администратор
Offline
Пол:
|
|
« Ответ #3 : 07-03-2013 09:13 » |
|
Да за такой код нужно убивать
Слав, это чужой код. Посмотри темы: https://forum.shelek.ru/index.php/topic,29049.0.htmlhttps://forum.shelek.ru/index.php/topic,29100.0.htmlДобавлено через 10 минут и 22 секунды:> особенности работы perl с utf8 Что за осбенности?
Особенность в том, что Perl изначально (зависит от опций сборки) работает с UTF-8: внутреннее преставление строк, константы в исходниках, потоки ввода-вывода. Кодировку потоков можно установить при открытии файла (man perlfunc), либо использовать Encode. Кодировку констант динамически определяет «use utf8|bytes». А теперь такой код проще перевести на любой язык
Слав, я от нее хотел этого добиться. Чужими мозгами думать не научишь.
|
|
« Последнее редактирование: 07-03-2013 09:27 от RXL »
|
Записан
|
... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
|
|
|
Sla
|
|
« Ответ #4 : 07-03-2013 09:54 » |
|
Слав, я от нее хотел этого добиться. Чужими мозгами думать не научишь. Я понимаю, понимает ли она, что я понимаю, что понимает она. Показал для того, что если нужно разобраться в чужом коде - отформатируй его под себя, для удобства чтения. так как в per может чуть выше viki но я читаю документацию (иногда) ord EXPR Returns the numeric value of the first character of EXPR. If EXPR is an empty string, returns 0. If EXPR is omitted, uses $_ . (Note character, not byte.) и там получаю ссылочку на http://perldoc.perl.org/perlunicode.htmlИ что я там вижу? use utf8 still needed to enable UTF-8/UTF-EBCDIC in scripts И там еще есть...
|
|
|
Записан
|
Мы все учились понемногу... Чему-нибудь и как-нибудь.
|
|
|
RXL
Технический
Администратор
Offline
Пол:
|
|
« Ответ #5 : 07-03-2013 10:24 » |
|
Особенность в том, что Perl изначально (зависит от опций сборки) работает с UTF-8: внутреннее преставление строк, константы в исходниках, потоки ввода-вывода. Кодировку потоков можно установить при открытии файла (man perlfunc), либо использовать Encode. Кодировку констант динамически определяет «use utf8|bytes».
Но для надежности и переносимости, при наличии не-ASCII констант use utf8 надо определять всегда. Тоже самое относится к синтаксису и я Вике в прошлый раз это объяснял. vika, мы ждем твоей реакции.
|
|
« Последнее редактирование: 08-03-2013 07:16 от RXL »
|
Записан
|
... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
|
|
|
vika
|
|
« Ответ #6 : 07-03-2013 21:20 » |
|
sub decode ($$) { ($a, $b) = @_; $V = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-_"; $c, $d; $e, $f, $g, $h, $k, $p = 0; $b &= 255; for ($f = 0; $f < length $a; $f++) { $d .= chr($b ^ ord(substr($a, $f))) } for ($a = $d; $p < length $a;) { $e = ord(substr($a, $p++)); $d = ord(substr($a, $p++)); $f = ord(substr($a, $p++)); $g = $e >> 2; $e = ($e & 3) << 4 | $d >> 4; $h = ($d & 15) << 2 | $f >> 6; $k = $f & 63; if ($d != $d) { $h = $k = 64 } elsif ($f != $f) { $k = 64 } $c = $c . substr($V, $q, 1) . substr($V, $e, 1) . substr($V, $h, 1) . substr($V, $k, 1) } return $c }
vika, у меня два предложения для улучшения темы и ускорения решения твоей задачи: 1. Отформатировать код для повышения читаемости. 2. Указать в [code] язык для включения подсветки. [code=javascript] и [code=perl] соответственно. Заметь, о безобразиях синтаксиса еще не слова. Сделано. Просто, форматированный код, это вроде как сугубо индивид. понятие, кому как удобнее. Синтаксис хоть и корявый, но работает же код... Язык в кодах указан. Код (на джаваскрипте) и правда не мой, но вроде как этого и не скрываю. А поделка на перл - моя. isnan джаваскриптовая функция, т.к. в перл ее нету де факто, а городить шляпу из еще одной функции не то, то вот и была подобрана такая альтернатива. Вопрос то, собственно в том, почему одни строки на перл и яве кодируются одинаково, а друге - нет. Где костыль?
|
|
« Последнее редактирование: 08-03-2013 07:32 от RXL »
|
Записан
|
|
|
|
Sla
|
|
« Ответ #7 : 07-03-2013 21:33 » |
|
vika, ты хочешь поворить код или понять как это работает? Если понять, то постарайся дать пременным человеческие имена ну как можно разбираться в этом птичьем язЕке? ($a, $b) = @_; $V = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-_"; $c,$d; $e, $f, $g, $h, $k, $p = 0;
Ты вот можешь сказать Что вообще эта функция делает, что поступает на вход, и что имее на выходе даю наводку a - inputStr b - cryptCode
|
|
|
Записан
|
Мы все учились понемногу... Чему-нибудь и как-нибудь.
|
|
|
vika
|
|
« Ответ #8 : 08-03-2013 01:18 » |
|
Приношу свои глуб. извинения. Хотя, лично мне так намного удобнее, т.к. с этим кодом уже довольно давно экспериментирую. Сейчас поправим.
|
|
|
Записан
|
|
|
|
RXL
Технический
Администратор
Offline
Пол:
|
|
« Ответ #9 : 08-03-2013 07:16 » |
|
Для удобства обсуждения я включил в ответе №6 нумерацию строк. За одно отформатировал код.
И так, Вика, расскажи, что происходит в каждой из следующих строк: 3, 4, 5 и 6.
|
|
« Последнее редактирование: 08-03-2013 07:33 от RXL »
|
Записан
|
... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
|
|
|
Sla
|
|
« Ответ #10 : 08-03-2013 07:18 » |
|
лично мне так намного удобнее Мне глубоко по фонарю как там названы перменные (я понимаю, почти, как это работает) Но! Чтобы мы говорили на одном языке - выберем для этого человекопонятные названия пременных
|
|
|
Записан
|
Мы все учились понемногу... Чему-нибудь и как-нибудь.
|
|
|
vika
|
|
« Ответ #11 : 09-03-2013 06:37 » |
|
расскажи, что происходит в каждой из следующих строк: 3, 4, 5 и 6.
В строке 3 происходит передача параметров подпрограмме из массива, в 4,5,6 - объявили переменные и присвоили им начальные значения.
|
|
|
Записан
|
|
|
|
RXL
Технический
Администратор
Offline
Пол:
|
|
« Ответ #12 : 09-03-2013 06:50 » |
|
Ты ответила меньше чем наполовину. Да, в строке 3 происходит приравнивание переменным $a и $b значений параметров, и, да, в строке 4 происходит приравнивание значения переменной $V, и, да, в строке 6 происходит приравнивание значения переменной $p. НО: 1. Какие это переменные? Вот тебе намек: sub xxx { $var = 123; }
xxx(); print $var, "\n"; Отсюда: как объявить корректно? 2. Строка 5: здесь нет объявления переменных. Читаем: а) списочный оператор «,»; б) автооживление переменных (только при no vars или no strict). 3. Та же беда в строке 6. Но тут еще есть присвоение. Т.ч. кроме вышеуказанного смотрим таблицу приоритета операций. Иначе фактический результат может быть далек от предполагаемого. 4. Мой тебе совет: если выражение завершается, поставь после него «;» и не искушай синтаксический анализатор. Выпендриваться можно бесконечно, Perl и не такое допускает, но быстрого и гарантированного результата можно добиться только при строгом соблюдении правил. Это как писать каллиграфически и «как курица лапой»: кого быстрее поймут и у кого окажется меньше ошибок? И давай стразу договоримся: традиции нашего форума — помочь понять, но если ты хочешь готового ответа, то пришла не по адресу и лучше сразу иди на free-lance.
|
|
« Последнее редактирование: 09-03-2013 06:53 от RXL »
|
Записан
|
... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
|
|
|
Sla
|
|
« Ответ #13 : 09-03-2013 07:04 » |
|
7. Зачем?
9-13 - Что?
|
|
|
Записан
|
Мы все учились понемногу... Чему-нибудь и как-нибудь.
|
|
|
vika
|
|
« Ответ #14 : 09-03-2013 07:17 » |
|
лично мне так намного удобнее Мне глубоко по фонарю как там названы переменные (я понимаю, почти, как это работает) Но! Чтобы мы говорили на одном языке - выберем для этого человекопонятные названия перемененных Вот так вот получше на ваш взгляд, уважаемый Sla ? sub decode ($$) { ($inputStr, $cryptCode) = @_; $V = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-_"; $output, $out; $chr1, $chr2, $enc1, $enc2, $enc3, $p = 0; $cryptCode &= 255; for ($chr2 = 0; $chr2 < length $inputStr; $chr2++) { $out .= chr($cryptCode ^ ord(substr($inputStr, $chr2))) } for ($inputStr = $out; $p < length $inputStr;) { $chr1 = ord(substr($inputStr, $p++)); $out = ord(substr($inputStr, $p++)); $chr2 = ord(substr($inputStr, $p++)); $enc1 = $chr1 >> 2; $chr1 = ($chr1 & 3) << 4 | $out >> 4; $enc2 = ($out & 15) << 2 | $chr2 >> 6; $enc3 = $chr2 & 63; if ($out != $out) { $enc2 = $enc3 = 64 } elsif ($chr2 != $chr2) { $enc3 = 64 } $output = $output . substr($V, $enc1, 1) . substr($V, $chr1, 1) . substr($V, $enc2, 1) . substr($V, $enc3, 1) } return $output }
7. Зачем? 9-13 - Что?
7 - операция "И". А 9 - 13 ,по видимому, для усложнения кода. Ввиду того, что жаба скрипт не мое творение, зачем оно там я понятия не имею, уж не сердитесь. Моя задача по аналогии "накидать" тоже самое на perl.
|
|
« Последнее редактирование: 09-03-2013 07:26 от vika »
|
Записан
|
|
|
|
vika
|
|
« Ответ #15 : 09-03-2013 07:25 » |
|
Ты ответила меньше чем наполовину. Да, в строке 3 происходит приравнивание переменным $a и $b значений параметров, и, да, в строке 4 происходит приравнивание значения переменной $V, и, да, в строке 6 происходит приравнивание значения переменной $p. НО: 1. Какие это переменные? Вот тебе намек: sub xxx { $var = 123; }
xxx(); print $var, "\n"; Отсюда: как объявить корректно? 2. Строка 5: здесь нет объявления переменных. Читаем: а) списочный оператор «,»; б) автооживление переменных (только при no vars или no strict). 3. Та же беда в строке 6. Но тут еще есть присвоение. Т.ч. кроме вышеуказанного смотрим таблицу приоритета операций. Иначе фактический результат может быть далек от предполагаемого. 4. Мой тебе совет: если выражение завершается, поставь после него «;» и не искушай синтаксический анализатор. Выпендриваться можно бесконечно, Perl и не такое допускает, но быстрого и гарантированного результата можно добиться только при строгом соблюдении правил. Это как писать каллиграфически и «как курица лапой»: кого быстрее поймут и у кого окажется меньше ошибок? И давай стразу договоримся: традиции нашего форума — помочь понять, но если ты хочешь готового ответа, то пришла не по адресу и лучше сразу иди на free-lance. Спасибо, вечером подумаем. Тоже было сомнение по поводу обьявления перменных, глобально, локально, только не пред. значение этому. А по поводу готового ответа - я все понимаю, в наше время за тебя делать никто не будет, не первый год замужем
|
|
« Последнее редактирование: 09-03-2013 07:28 от vika »
|
Записан
|
|
|
|
Sla
|
|
« Ответ #16 : 09-03-2013 07:58 » |
|
for ($chr2 = 0; $chr2 < length $inputStr; $chr2++) { $out .= chr($cryptCode ^ ord(substr($inputStr, $chr2))) }
Я бы спросил - а в чем разница между out и d что вообще происходит в этой строке.. И... Слушай внимательно!!!! Начинаю цикл Присваиваю некой переменной значение равное, а теперь внимательно!!!!, самой переменной клееной с другой пременной Заканчиваю цикл Все переменные должны быть определены. В js-скрипте это сделано.
|
|
« Последнее редактирование: 09-03-2013 08:51 от Sla »
|
Записан
|
Мы все учились понемногу... Чему-нибудь и как-нибудь.
|
|
|
RXL
Технический
Администратор
Offline
Пол:
|
|
« Ответ #17 : 09-03-2013 08:21 » |
|
Тоже было сомнение по поводу обьявления перменных, глобально, локально, только не пред. значение этому.
Настоятельно рекомендую изучить этот вопрос. Он важен в любом языке. А по поводу готового ответа - я все понимаю, в наше время за тебя делать никто не будет, не первый год замужем Глупо думать, что сейчас особенное время, отличное от какого-то другого. Люди одинаковы во все времена. Глупый студент, только чтобы потешить свое ЧСВ и выпендриться перед женским ником (анонимность!) готов выдавать ответы на гора, совсем не думая о результате. Человек более опытный либо не будет делиться, либо поделиться, но делать за кого-то не станет, т.к. время можно заменить на деньги или другой способ получить получить удовлетворение. Обучение тоже есть удовлетворение. Если, конечно, ученик это понимает. Добавлено через 3 минуты и 17 секунд:Все пременный должны быть определены. В js-скрипте это сделано.
Вот именно. И чтобы избежать ошибок, предлагаю сперва навести порядок: 1. Завершение выражений. 2. Аргументы функций только в скобках. 3. Обязательное объявление переменных. 4. Как следствие, надо включить use strict и потеть до исчезновения ошибок.
|
|
« Последнее редактирование: 09-03-2013 08:27 от RXL »
|
Записан
|
... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
|
|
|
vika
|
|
« Ответ #18 : 14-03-2013 01:40 » |
|
Настоятельно рекомендую изучить этот вопрос. Он важен в любом языке. Будет сделано. Глупо думать, что сейчас особенное время, отличное от какого-то другого. Люди одинаковы во все времена. Глупый студент, только чтобы потешить свое ЧСВ и выпендриться перед женским ником (анонимность!) готов выдавать ответы на гора, совсем не думая о результате. Человек более опытный либо не будет делиться, либо поделиться, но делать за кого-то не станет, т.к. время можно заменить на деньги или другой способ получить получить удовлетворение. Обучение тоже есть удовлетворение. Если, конечно, ученик это понимает. Ну, времена все таки разные. Раньше человеку станет на улице плохо, так ему окажут помощь, вызовут врача. Сейчас же толпа зевак разве что поглазеет, да люмпеновско-маргинальная прослойка обберет, а то и добъет. Что не говорите, уважаемый RXL, но вы либо за границей живете, либо в каком то заоблачном мире витаете... И что значит "Глупый студент, только чтобы потешить свое ЧСВ и выпендриться перед женским ником (анонимность!) готов выдавать ответы на гора, совсем не думая о результате." Глупые студенты тешут свое .... попивая пиво, да языком цепляя прохожих. Вы думаете, что кто то находит удовлетворение в ковырянии кода??? А анонимность тут вообще не причем. может, я просто с полом еще определиться не могу. Вот именно. И чтобы избежать ошибок, предлагаю сперва навести порядок: 1. Завершение выражений. 2. Аргументы функций только в скобках. 3. Обязательное объявление переменных. 4. Как следствие, надо включить use strict и потеть до исчезновения ошибок.
Код конечно можно вылизать до безупречности. Но, как оказалось, собака зарыта немного глубже А дело в том, что перл коряво работает с utf8, с прагмами толком еще надо разбираться. И вот когда с сервера приходят данные в кодировке utf8, что то с ними происходит, они портятся и в результате на выходе кодировщика как раз и получается шляпа. Это было выяснено опытным путем. Т.е., строка нормально кодировалась в локальной версии кодировщика, а в составе программы она почему то портилась. В общем, всем спасибо за участие, будем разбираться.
|
|
|
Записан
|
|
|
|
RXL
Технический
Администратор
Offline
Пол:
|
|
« Ответ #19 : 14-03-2013 06:08 » |
|
В «заграницах», где я живу, как при советской власти, так и сейчас картина одна и та же: могут пройти мимо, а могут совершенно безвозмездно помочь. Люди не меняются, но их стало слишком много. Но это все офтоп. Надеюсь суть того абзаца моего поста дошла до тебя, а не только формулировка. Перл работает не коряво. Просто у кого-то мало знаний и много уверенности в своем уникальном пути. Рекомендую начинать каждую программу на Perl так и разбирать каждое возникающее предупреждение или ошибку: #!/usr/bin/perl -W use strict; Код конечно можно вылизать до безупречности. Но, как оказалось, собака зарыта немного глубже А дело в том, что перл коряво работает с utf8, с прагмами толком еще надо разбираться. И вот когда с сервера приходят данные в кодировке utf8, что то с ними происходит, они портятся и в результате на выходе кодировщика как раз и получается шляпа. Это было выяснено опытным путем. Т.е., строка нормально кодировалась в локальной версии кодировщика, а в составе программы она почему то портилась. В общем, всем спасибо за участие, будем разбираться. Насчет UTF-8 я уже писал: внутри Perl имеет преставление строк в виде UTF-8. Задача программиста дать понять, какого формата его константы и полученные извне строки. Была у нас тема на счет перекодировок: https://forum.shelek.ru/index.php/topic,25664.0.htmlНасчет «нормально»: это не аргумент. Приведи пример кода для теста.
|
|
« Последнее редактирование: 14-03-2013 06:10 от RXL »
|
Записан
|
... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
|
|
|
|