Javascript-форум (https://javascript.ru/forum/)
-   Events/DOM/Window (https://javascript.ru/forum/events/)
-   -   Системы счисления. Кодировка и обратно. Php и Js (https://javascript.ru/forum/events/37492-sistemy-schisleniya-kodirovka-i-obratno-php-i-js.html)

RazZzeR 22.04.2013 04:46

Системы счисления. Кодировка и обратно. Php и Js
 
Доброго времени суток, и заранее благодарю. :thanks:
Для понимания должно быть просто.

Название пользовательских файлов = id из базы данных + расширение.
Например "123345666677777888.jpg", "887766252523.png"
Хотел бы чуть уменьшить размер названия файла (особенно некрасиво получается когда id уходит за 9, 12 чисел, слишком длинный адрес)


И, думаю, самым ОПТИМАЛЬНЫМ решением является называть файлы в другой системе счисления. (да еще не надо лишнюю информацию о адресе файла хранить в базе при таком раскладе)

Например: "15099" (10) => "bnf" (36) (в итоге: -2 символа)
И большое число: "1000562" (10) => "lg1e" (36) (в итоге: -3символа)
И еще больше: "1000562627" (10) => "gjpj2b" (36) (в итоге: -4символа)
Напомню, что 36ая система представляет из себя набор всех чисел и букв англ. алфавита (0-9, a-z).

Base = {
 to36 : function (a){ // кодируем
  return this.convert(a, 10, 36);
 },
 to10 : function (a){ // обратно
  return this.convert(a, 36, 10);
 },
 convert : function (number, from, to) {
  return parseInt(number + '', from | 0).toString(to | 0);
 }
}

Вот так реализовано на js, вызывать Base.to36(магические_цифры)

на php вот так:
$binary = '1000562627';
echo base_convert($binary, 10, 36);
(третий пример, выведет "gjpj2b")

Цель: нужны функции кодирования (в новую систему счисления и желательно обратно).
Система счисления: цифры (0-9) и англ. алфавит на обоих раскладках (a-z, A-Z).


И забыл уведомить - Base.convert(a, 10, Любое число больше 36);
вызовет ошибку (что не удивительно):
RangeError: toString() radix argument must be between 2 and 36

Возможны ошибки в построении темы (исправлю) - не сплю 2 дня (посплю в аду, которого нет :D).

Уверен, что есть подобная реализация (если я буду строить такую функцию, то она уйдет у меня более чем в 50 строк, а это неуместно). В любом случае буду благодарен.

RazZzeR 22.04.2013 05:24

и раздел еще попутал :-E

danik.js 22.04.2013 06:12

А смысл?
Цитата:

Сообщение от RazZzeR
"123345666677777888.jpg"

У тебя что, триллиарды картинок?

RazZzeR 22.04.2013 12:48

Цитата:

Сообщение от danik.js (Сообщение 247485)
А смысл?

У тебя что, триллиарды картинок?

нет конечно, заело :D
ps: example

смысла фактически нет.
мне недавно сказали, что так называть картинки неприемлимо и немного непрофессионально.
спорить с этим не буду, так как причин не знаю (предположительно - возможен перебор вручную картинок (+- id), длинный адрес картинки Оо).

Можно и кодить без проблем в 36 - ричную систему счисления, нет проблем, но хотелось бы в более широкую, для лучшего эффекта.

rgl 22.04.2013 14:07

var fileNameEncode, fileNameDecode;

(function() {
  var sEncode = [ '0', '1', '2', 'a', 'b', 'c', '-', '+', '_' ];
  // реальный массив должен быть большим, напр. 0..9, a..z, другие символы
  var sDecode = {};
  var x1, i;
  for( i = 0; i < sEncode.length; ++i )
    sDecode[ sEncode[i] ] = i;
  fileNameEncode = function( x ) {
    x = +x; // преобразуем в десятичное число
    var ret = "";
    do {
      ret = sEncode[ x % sEncode.length ] + ret;
      x = Math.floor( x / sEncode.length );
    } while( x );
    return ret;
  }
  fileNameDecode = function( x ) {
    x = x.toString();
    var ret = 0;
    for( i = 0; i < x.length; ++i )
      ret = ret * sEncode.length + sDecode[ x.charAt(i) ];
    return ret;
  }
})();

var tt = fileNameEncode( '12345' );
alert( tt + "  " + fileNameDecode( tt ) );

RazZzeR 22.04.2013 15:19

:thanks: благодарю
1/2 решена.
Теперь php, оправляюсь в другую галактику

RazZzeR 22.04.2013 15:36

alert0123 = function(){
      alert(sEncode[0] + sEncode[1] + sEncode[2] + sEncode[3]);
  }

  sEncode = [ '0', '1', '2', 'a', 'b', 'c', '-', '+', '_' ]; // предоставленный вариант
   alert0123();
  sEncode = '012abc-+_'; // 2
   alert0123();


Собственно второй вариант удобнее, есть противопоказания?

rgl 22.04.2013 19:39

Всяких вариантов можно придумать много, вот, напр:
sEncode = '012abc-+_'.split('');

или
var sEncode = Array(36)
for( i = 0; i < 10; ++i )
  sEncode[i] = String.fromCharCode( 48+i );
for( i = 10; i < 36; ++i )
  sEncode[i] = String.fromCharCode( 87+i );
sEncode = sEncode.concat( "+-_@!".split( "" ) );

rgl 22.04.2013 19:42

Цитата:

Собственно второй вариант удобнее, есть противопоказания?
В шестом IE скобочки [] со строкой могут не работать, но можно заменить на charAt()

with-love-from-siberia 22.04.2013 20:15

Base64.

Только зачем? 36-ричной системы достаточно. Плюсом является полная реализация как на php, так и на js.


Часовой пояс GMT +3, время: 13:47.