я так понял, функция chr принимает только целые ДЕСЯТИЧНЫЕ значения в качестве аргумента, с целыми в хексе она не работает, так что код Macro выводит не тот результат, что требуется. Так как входная строка (точнее пары символов) - она предполагается в хексе (это хэш вообще-то с набором символов 0-9a-f), а не коды символов в десятичном виде. т.е 30313233343536373839404142434445 -> !"#$%&'()*+,- а вообще-то надо: 30313233343536373839404142434445 -> 0123456789@ABCDE так как 0x30 это 0, 0x31 - 1 и т.д. так что VampiRUS прав, надо преобразовывать в десятичный вид аргумент, прежде чем скормить chr его. ЗЫ Вопрос решён принципе, но может есть ещё более изящное и оптимальное решение?
Ну и теперь два вопроса: 1. Реально ли в мускуле хранить такие строки (в том числе и с непечатаемыми служебными символами с кодами 0-255) ? 2. С обратным преобразованием не будет проблем?
моё не подойдёт? (Под редакцией Macro, конечно) Надо только "0x" дописать было: PHP: <?php echo preg_replace('/([A-F\d]{2})/ie', 'chr(0x\1)', '30313233343536373839404142434445'); ?> Выдает требуемое: Code: 0123456789@ABCDE
Входные данные это любой мд5 хэш (32 символа 0-9a-z), т.е 32 байта в ASCII представлении, задача: его закодировать в 16 байт, в heх, так как md5-хэш на самом деле это ничто иное как HEX-число в 16 байт.
Я наверное не совсем так выразился.Мне не нужен именно переводчик. Мне нужно ятоб например юзер вводить в форме: r57а ему в ответ - Шелл.Последнея версия...Сайт. Думаю понял. Я хотел сделать файл типа base.php PHP: <? $slova = array( 'r57'=>'Шелл.Последняя версия' 'qwe'=>'qwe' ); ?> Мне нужна функция, котороя б брала слова из етого файла и "переводила их"
Теперь нужна функция обратного преобразования этой: PHP: function code_hash($hash) { include('conf.php'); $n=0; $hash_code=""; do { $code='0x'.$hash[$n].$hash[$n+1]; $hash_code.=chr(hexdec($code)); $n++; } while ($n++<31); return $hash_code; } PHP: function decode_hash($string) { $n=0; $decode_hash=""; do { $code=ord($string[$n]); $decode_hash.=dechex($code); } while ($n++<15); return $decode_hash; }
Нужно написать скрипт, который будет рисовать график функции y=a*x^2+b*x+c, значения a,b,c задаются с клавиатуры. Сетку я сделал, обычную параболу вывести могу, но не понимаю как задать нужную функцию и коэффициенты вручную. Как работает: Code: http://mytesterphp.h18.ru/graph.php Код: PHP: <?php include ("src/jpgraph.php"); include ("src/jpgraph_line.php"); include ("src/jpgraph_utils.inc.php"); $f = new FuncGenerator('$x*$x'); list($x1data,$y1data) = $f->E(-5,5); $graph = new Graph(550,450,"auto"); $graph->SetScale("linlin"); $graph->SetShadow(); $graph->img->SetMargin(50,50,60,40); $graph->SetBox(true,'darkgreen',2); $graph->SetMarginColor('white'); $graph->SetColor('lightyellow'); $graph->title->Set('ax^2+bx+c=0'); $graph->title->SetFont(FF_FONT1,FS_BOLD); $graph->xgrid->Show(); $graph->yaxis->SetPos(0); $graph->yaxis->SetWeight(2); $graph->yaxis->HideZeroLabel(); $graph->yaxis->SetFont(FF_FONT1,FS_BOLD); $graph->yaxis->SetColor('darkgreen','darkblue'); $graph->yaxis->HideTicks(true,false); $graph->yaxis->HideFirstLastLabel(); $graph->xaxis->SetWeight(2); $graph->xaxis->HideZeroLabel(); $graph->xaxis->HideFirstLastLabel(); $graph->xaxis->SetFont(FF_FONT1,FS_BOLD); $graph->xaxis->SetColor('darkgreen','darkblue'); $lp2 = new LinePlot($y1data,$x1data); list($xm,$ym)=$lp2->Max(); $lp2->SetColor('orange'); $lp2->SetWeight(2); $graph->Add($lp2); $graph->Stroke(); ?>
Вот сделал функцию для распознавания типа хэша (пока только 4, точнее 3, так как хэши MySQL5 и SHA-1 неотличимы). PHP: function type_hash($string) { if (ereg('^([a-fA-F0-9]{16})$', $string)) return 1; // MySQL if (ereg('^([a-fA-F0-9]{32})$', $string)) return 2; // MD5 if (ereg('^([a-fA-F0-9]{40})$', $string)) return 3; // MySQL5 или SHA-1 return 0; // неизвестен } 1.Как сделать тоже самое, используя функцию preg_match? 2. Помогите с регулярками для определения типов хэшей: DES (пример:HlXOX8MN5z4X6), MD5 (Unix) $1$$uqbusDeGY2YWqg.T2S1100 MD5(APR) $apr1$$kRqAZHnuzcwDL84Mm7oc1. MD5(Base64) Gh3JHJBzJcaScd3wyUS8cg== SHA-1 (Base64) NU4eI71bcnBGqeO0t9tXvY1u5oQ=
1. PHP: if (preg_match("/^([a-fA-F0-9]{16})$/",$string)) echo 'MySQL '; if (preg_match("/^([a-fA-F0-9]{32})$/",$string)) echo 'MD5 '; if (preg_match("/^([a-fA-F0-9]{40})$/",$string)) echo 'MySQL или SHA-1'; 2. также как ты и делал, только те символы что не изменяются просто вводишь (только перед доларом надо постави "\" ) итак пример для MD5(APR) $apr1$$kRqAZHnuzcwDL84Mm7oc1. /^\$arp1\$\$[a-zA-Z0-9]{21}$/ ПС:для написания и отладки регулярных выражений можно использовать специальные прожки, например, VisualREGEXP и The Regex Coach
Вот способ как запросить из мускула MySQL хэш: PHP: $query = "SELECT PASSWORD('".$pass."')"; $r = mysql_query($query); $rq = mysql_fetch_array($r); $hash = $rq[0]; //МуSQL хэш Я так понял, что если Мускул <5 это будет хэш (0-9a-z {8}) а если MySQL5 то хэш будет (0-9a-z {40}) Теперь вопрос: Как независимо от версии Мускула получать хэши MySQL и MySQL5 от какого либо значения? Т.е. может есть готовые функции хэширования на PHP, независящие от мускула и не обращающеся к нему? Ну типа как в встроенных функциях PHP md5(), sha1() ЗЫ Чё? так никто и не знает как в Мускуле <5 вычислить хэш Mysql5 ? Видел где-то что sha1(sha1(password)) это и есть MySQL(password) это так ? Щас проверю сам... неправда
Это ты же создаешь именной масив. для того чтобы взять значение из него пиши: PHP: echo $slova['r57'];
2 -=lebed=- PHP: <? echo sha1(sha1('mypass',1)); ?> Про это узнал вот тут http://www.wasm.ru/forum/viewtopic.php?pid=203131#p203131 Обрати внимание на слова Проверил на ПассвордПро sha1('mypass') = e727d1464ae12436e899a726da5b2f11d8381b26 MySQL5('mypass') = 6c8989366eaf75bb670ad8ea7a7fc1176a95cef4 echo sha1(sha1('mypass',1)); >>> 6c8989366eaf75bb670ad8ea7a7fc1176a95cef4 Весь прикол в НЕОБЯЗАТЕЛЬНОМ параметре sha1. Нашел тут http://delaysayt.ru/sha1-vozvraschaet-sha1-hesh-stroki.html Думаю это то что тебе нужно
проверил, пашет! хэши скрипт от mypass выдаёт правильные. Хэш MySQL:6f8c114b58f2ce9e Хэш MD5:a029d0df84eb5549c641e04a9ef389e5 Хэш SHA1:e727d1464ae12436e899a726da5b2f11d8381b26 Хэш MySQL5:6c8989366eaf75bb670ad8ea7a7fc1176a95cef4 Но вот трабла при занесении в таблицу после преобразования этих хэшей, запрос вида: PHP: INSERT INTO passwd_hash (`passwd`,`code1`,`code2`,`code3`,`code4`) VALUES ('mypass','oЊKXтОћ',' )РЯ„лUIЖAаJћу‰е','з'СFJб$6虧&Ъ[/Ш8&','l‰‰6nЇu»g ШкzБj•Оф') Выдаёт ошибку синтаксиса, так как после кодирования хэшей всплыли спецсимволы. Какой тип данных поставить для полей, чтоб можно было хранить строку из любых символов (0-ff) Напомню, мне нужно хранить (записывать) хэши в таблице(у) не в ASCII представлении, а в виде последовательности любых байтов, т.е в hex чтоб размер поля был в два раза меньше, т.е 8, 16, 20 байт для каждого типа хэша соответствено. Использовал типы данных binary(8), binary(16), binary(20), binary(20) - непрокатывает запрос! Тип bigint - 8 байт, подойдёт только для хранения хэша MySQL, а что делать с остальными (делить на столбцы не хотелось бы). ЗЫ Даже тут видно, что запрос испортила всплывшая одинарная ковычка, в коде одного из хэшей.
varchar(8), varchar(16), varchar(20) и прогоняй значения перед вставкой через mysql_escape_string(), она заэкранирует все спецсимволы, но мускул поймет все правильно ЗЫ еще как вариант BLOB, но так как поле динамическое возникнут траблы с быстродействием
BLOB не пойдёт, но ведь и тип varchar имеет динамический размер?! мне надо чтоб хэш занимал в таблице ровно столько байт, сколько на него реально нужно... Up: вопрос решён, символы экранирования не записываются в столбцы таблицы, размер остаётся верный, исп. тип Binary.
varchar имеет фиксированный размер (не зря он в скобках указан=)). Днамические поля - это TEXT, BLOB и производные