alpha numeric 2

tolst

Новичок
alpha numeric 2

доброй всем ночи.
такой вопрос:

есть ли аналог это функции в PHP (alpha numeric 2) ?
переписал бы сам давно уже, да ничего не понимаю в этом коде.
заранее благодарен

PHP:
int encode_alphanum(unsigned char *dest,unsigned char *src,int len){
  char dump[2];
  int   i,n, input, A, B, C, D, E, F;
  char* valid_chars;
  struct timeval tv;
  struct timezone tz;
  memset(dest,0x00,MAX_ENCODED_LEN);
  gettimeofday(&tv, &tz);
  srand((int)tv.tv_sec*1000+tv.tv_usec);
  strcat(src,"\x80");
  valid_chars = "0123456789BCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz";
  for(n=0;n<len;n++) {
    input = src[n];
    A = (input & 0xf0) >> 4;
    B = (input & 0x0f);
    F = B;
    i = rand() % strlen(valid_chars);
    while ((valid_chars[i] & 0x0f) != F) { i = ++i % strlen(valid_chars); }
    E = valid_chars[i] >> 4;
    D = (A^E);
    i = rand() % strlen(valid_chars);
    while ((valid_chars[i] & 0x0f) != D) { i = ++i % strlen(valid_chars); }
    C = valid_chars[i] >> 4;
    sprintf(dump,"%c%c", (C<<4)+D, (E<<4)+F);
    strcat(dest,dump);
  }
  strcat(dest,"A");
  return 0;
}
 

tolst

Новичок
нет, я интересуюсь есть ли готовые решения у PHP, перерыл мануал, интернет, гугл, гугл коде, ничего не нашол (((((
 

Alexandre

PHPПенсионер
т.е. ты предлагаешь в этом говнокоде сидеть и разбираться нам?
это просто Си...
не такой уж и плохой ...код
только не сомсем понятно шаманство с
Код:
gettimeofday(&tv, &tz);
  srand((int)tv.tv_sec*1000+tv.tv_usec)
можно упростить до srand((int)tv.tv_sec));

-~{}~ 10.08.09 16:29:

вообще-то это base62.
если это base64 -зачем тогда исп rand()????
 

dimagolov

Новичок
если это base64 -зачем тогда исп rand()????
:) не заметил
вообще-то я думал про base62 (набор символов из base62), но не в этом суть. Я тоже кодирую "не канонически" примешивая дополнительный сдвиг, чтобы не было очевидно что за число закодировано. Но так как мне еще и раскодировать нужно, то я примешиваю не случайное значение. Как автор этого шедевра собрался раскодировать полученное значение для меня загадка. Разве что он изображал хеш?

-~{}~ 10.08.09 09:50:

хотя какой нафиг хеш, если получаемые значения не повторяются (судя по srand((int)tv.tv_sec*1000+tv.tv_usec))?
 

SiMM

Новичок
> Как автор этого шедевра собрался раскодировать полученное значение для меня загадка.
Там же избыточность большая - младшая тетрада исходных байтов, к примеру, остаётся нетронутой.
 

dimagolov

Новичок
tolst, тебе зачем ее надо переводить? одной encode_alphanum ведь не отделаешься, еще и decode_alphanum надо портировать.
 

Alexandre

PHPПенсионер
операции типа
PHP:
 E = valid_chars[i] >> 4;
в РНР работают медленно, уже наступали на эти грабли ;)
я бы ее не портировал, а написал экстеншен :), Си же...
и не имел бы головной боли.
 

SiMM

Новичок
> я бы ее не портировал, а написал экстеншен
Гвозди мелкоскопом забивать можно, только это абсолютно бессмысленно и дорого. Особенно учитывая то, что большая часть вышеприведённого кода абсолютно бессмысленна.
PHP:
function encode($src) {
  $dest = '';
  for ($n = 0; $n < strlen($src); $n++) {
    $input = ord($src[$n]);
    $A = $input>>4;
    $F = $B = $input&0x0F;
    $E = mt_rand(3,7);
    $D = $A^$E;
    $C = mt_rand(3,7);
    $dest .= chr($C*16+$D).chr($E*16+$F);
  }
  return $dest.'A';
}
function decode($src) {
  $ret = '';
  for ($n = 1; $n < strlen($src); $n += 2) {
    $input = ord($src[$n]);
    $F = $input & 0x0F;
    $E = $input >> 4;
    $D = ord($src[$n-1]) & 0x0F;
    $ret .= chr(($D^$E)*16+$F);
  }
  return $ret;
}

echo decode(encode('тестовая строка'));
Если где и ошибся - то в неочевидных вещах (к примеру, нафига портить строку src, дописывая к ней 0x80 - неочевидно, так же, как неочевидно, для чего в функцию передаётся параметр len).
 

Alexandre

PHPПенсионер
Гвозди мелкоскопом забивать можно, только это абсолютно бессмысленно и дорого. Особенно учитывая то, что большая часть вышеприведённого кода абсолютно бессмысленна
по этому бы и не парился :)
завернуть в экстеншен при небольшом опыте - пару часов от силы.

-~{}~ 11.08.09 02:05:

так же, как неочевидно, для чего в функцию передаётся параметр len
очевидно , для того чтоб пробежаться по строке
Код:
 for(n=0;n<len;n++) { 
...
}
Очевидно предполагается, что строка [участок памяти] не ограничивается 0-терминальным символом или возможно он может присутствовать в строке. т.е кодирование идет не Си-строки, а именно участка памяти. Опять же - догадки...
 

SiMM

Новичок
> завернуть в экстеншен при небольшом опыте - пару часов от силы.
Даже если пять минут - вопрос целесообразности это не отменяет.

> строка [участок памяти] не ограничивается 0-терминальным символом или возможно он может присутствовать в строке
Использование strcat(src,"\x80") при таких условиях довольно сомнительно.
PS: муть с valid_chars топикстартер может добавить самостоятельно - должен же он хоть что-то сделать сам.
 
Сверху