Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #1 (permalink)  
Старый 22.04.2013, 04:46
Аватар для RazZzeR
Кандидат Javascript-наук
Отправить личное сообщение для RazZzeR Посмотреть профиль Найти все сообщения от RazZzeR
 
Регистрация: 11.12.2011
Сообщений: 146

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

Название пользовательских файлов = 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 дня (посплю в аду, которого нет ).

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

Последний раз редактировалось RazZzeR, 22.04.2013 в 04:57.
Ответить с цитированием
  #2 (permalink)  
Старый 22.04.2013, 05:24
Аватар для RazZzeR
Кандидат Javascript-наук
Отправить личное сообщение для RazZzeR Посмотреть профиль Найти все сообщения от RazZzeR
 
Регистрация: 11.12.2011
Сообщений: 146

и раздел еще попутал
Ответить с цитированием
  #3 (permalink)  
Старый 22.04.2013, 06:12
Аватар для danik.js
Профессор
Отправить личное сообщение для danik.js Посмотреть профиль Найти все сообщения от danik.js
 
Регистрация: 11.09.2010
Сообщений: 8,804

А смысл?
Сообщение от RazZzeR
"123345666677777888.jpg"
У тебя что, триллиарды картинок?
Ответить с цитированием
  #4 (permalink)  
Старый 22.04.2013, 12:48
Аватар для RazZzeR
Кандидат Javascript-наук
Отправить личное сообщение для RazZzeR Посмотреть профиль Найти все сообщения от RazZzeR
 
Регистрация: 11.12.2011
Сообщений: 146

Сообщение от danik.js Посмотреть сообщение
А смысл?

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

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

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

Последний раз редактировалось RazZzeR, 22.04.2013 в 13:11.
Ответить с цитированием
  #5 (permalink)  
Старый 22.04.2013, 14:07
Аватар для rgl
rgl rgl вне форума
Профессор
Отправить личное сообщение для rgl Посмотреть профиль Найти все сообщения от rgl
 
Регистрация: 28.02.2011
Сообщений: 349

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 ) );
Ответить с цитированием
  #6 (permalink)  
Старый 22.04.2013, 15:19
Аватар для RazZzeR
Кандидат Javascript-наук
Отправить личное сообщение для RazZzeR Посмотреть профиль Найти все сообщения от RazZzeR
 
Регистрация: 11.12.2011
Сообщений: 146

благодарю
1/2 решена.
Теперь php, оправляюсь в другую галактику
Ответить с цитированием
  #7 (permalink)  
Старый 22.04.2013, 15:36
Аватар для RazZzeR
Кандидат Javascript-наук
Отправить личное сообщение для RazZzeR Посмотреть профиль Найти все сообщения от RazZzeR
 
Регистрация: 11.12.2011
Сообщений: 146

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

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


Собственно второй вариант удобнее, есть противопоказания?
Ответить с цитированием
  #8 (permalink)  
Старый 22.04.2013, 19:39
Аватар для rgl
rgl rgl вне форума
Профессор
Отправить личное сообщение для rgl Посмотреть профиль Найти все сообщения от rgl
 
Регистрация: 28.02.2011
Сообщений: 349

Всяких вариантов можно придумать много, вот, напр:
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( "" ) );
Ответить с цитированием
  #9 (permalink)  
Старый 22.04.2013, 19:42
Аватар для rgl
rgl rgl вне форума
Профессор
Отправить личное сообщение для rgl Посмотреть профиль Найти все сообщения от rgl
 
Регистрация: 28.02.2011
Сообщений: 349

Цитата:
Собственно второй вариант удобнее, есть противопоказания?
В шестом IE скобочки [] со строкой могут не работать, но можно заменить на charAt()
Ответить с цитированием
  #10 (permalink)  
Старый 22.04.2013, 20:15
Профессор
Отправить личное сообщение для with-love-from-siberia Посмотреть профиль Найти все сообщения от with-love-from-siberia
 
Регистрация: 14.12.2009
Сообщений: 155

Base64.

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

Последний раз редактировалось with-love-from-siberia, 22.04.2013 в 20:32.
Ответить с цитированием
Ответ



Опции темы Искать в теме
Искать в теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Передача переменной из JS в PHP и обратно Gregorian Общие вопросы Javascript 5 11.09.2012 16:12
Как передавать параметры из php скрипта в js imissyouso Общие вопросы Javascript 3 01.08.2012 18:24
Связь между страницами с javascript и php ... и обратно okrip25 AJAX и COMET 7 09.01.2012 14:43
Не получается передать переменную из JS в PHP Lion_astana AJAX и COMET 2 23.11.2010 17:23
Передача переменной с JS в PHP и обратно kamushek Общие вопросы Javascript 2 22.08.2010 16:12