Сокращение текстовой строки ASCII - PullRequest
0 голосов
/ 21 февраля 2010

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

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

Возможно ли это с Javascript, это уже было сделано?

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

Ответы [ 5 ]

2 голосов
/ 21 февраля 2010

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

1 голос
/ 24 марта 2010

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

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

1 голос
/ 21 февраля 2010

Поскольку 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 голос
/ 21 февраля 2010
0 голосов
/ 21 февраля 2010

Вы можете использовать простой подстановочный шифр . Вот пример в JavaScript .

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

...