2010-02-20 4 views
0

Меня не интересует безопасность или что-либо в этом роде, но мне нужны некоторые функции, которые позволяют мне «сжимать»/«распаковывать» строку. Я пробовал Base64, но это имеет большую проблему с размером строки, это делает ее более длинной. Я также знаю об этом материале Хаффмана, но это не работает либо потому, что оно также делает его длиннее (меньше с точки зрения памяти, это целое число).Сокращение текстовой строки ASCII

Другими словами, я хочу, чтобы какая-то произвольная строка 'djshdjkash' была закодирована в какую-то другую строку 'dhaldhnctu'. Уметь переходить от одного к другому, а длина новой строки равна или меньше оригинала.

Возможно ли это с помощью Javascript, уже сделано?

  • Необходимо уточнить, поскольку я сказал, что безопасность не является целью, просто замаскировать строку и сохранить ее длину (или укоротить ее). Base64 - лучший пример, но он делает строки длиннее. ROT13 является аккуратным, но не охватывает все символы ASCII, только буквы.
+0

Вы помещаете «закодировать» в кавычки. Просьба уточнить, действительно ли вы пытаетесь скрыть что-то. Если нет, пожалуйста, проясните, что это такое. г для выполнения. – bmargulies

+1

Вы можете упаковать два символа ASCII в один символ UTF-16. – Gumbo

ответ

1
+1

Проголосовал за вас, но звучит так, как будто он хочет ROT47: http://en.wikipedia.org/wiki/ROT13#Variants –

+1

В этом случае вы можете сделать классику: добавьте 1 к каждому байту. Вы также можете повернуть всю строку пополам. –

2

Вам необходимо сжатие, не кодирование. Кодирование обычно добавляет биты. Google «Алгоритмы сжатия строк».

+2

Также обратите внимание, что если ваш ввод является коротким (например, 'djshdjkash'), большинство произвольных алгоритмов сжатия ввода дают большие результаты. Только когда вы проходите порог в длину, вы начинаете видеть победы в компрессии. –

+0

Я должен был упомянуть об этом. Строка примера не будет хорошо сжиматься с большинством общих алгоритмов, которые вы найдете в Интернете. –

0

Вы можете использовать простой substitution cipher. Вот example in JavaScript.

Обратите внимание, что есть инструменты для разрыва шифров замещения. Сделайте уверенным, что безопасности здесь не проблема, прежде чем идти по этому пути.

1

Поскольку ROT13 отсутствует, потому что он влияет только на альфа, почему бы просто не реализовать что-то в более широком наборе символов. Настройте массив from символов, содержащий весь набор символов для печати, и массив to, содержащий те же символы в другом порядке.

Затем для каждого символа в вашей строке, если он находится в массиве from, замените его эквивалентной позицией в массиве to.

Это не дает никакого сжатия, но удовлетворит все ваши требования (короче или одинаковой длины, замаскированная строка).

В псевдо-коде, что-то вроде:

chfrom = "ABCDEF..." 
chto = "1$#zX^..." 
def encode(s1): 
    s2 = "" 
    foreach ch in s1: 
     idx = chfrom.find(ch) 
     if idx == -1: 
      s2 += ch 
     else: 
      s2 += chto[idx] 
    return s2 
def decode(s1): 
    # same as encode but swap chfrom and chto. 
1

Я не уверен, что именно вы хотите сжать. Если это длина строки (как видно из String.length(), вы можете сжать два символа ASCII в символ Юникода. Таким образом, строка типа hello, world (12 символов) может привести к \u6865\u6c6c\u6f2c\u206f\u6f72\u6c64 (6 символов). Вы должны быть очень осторожны, хотя что вы не генерируете недопустимые символы, такие как \uFFFF, и что вы всегда можете вернуться из сжатой строки в несжатую.

С другой стороны, если вы хотите уменьшить длину строкового литерала, совершенно неправильно, поэтому проясните, при каких обстоятельствах вы хотите сжать строки.

Смежные вопросы