Как сделать простой энкодер и декодер?

У меня есть следующий код:

<DOCTYPE HTML>
<html>

<body>
<script type="text/javascript">

//Chat Encoder
//Made by Hducke aka Hunter Ducker

//VARS
var userInputA = "";
var userInputB = "";
var result = userInputB.split("");

//FUNCTIONS

var encodeMessage = function(){

    var output = "";

    userInputB = prompt("Type your message here:", "PLEASE TYPE YOUR MESSAGE IN LOWER CASE!");

    for(var i = 0; i <= result.length; i++){
        switch(result[i]){
            case("a"):
                result[i] = "1";
            break;
            case("b"):
                result[i] = "2";
            break;
            case("c"):
                result[i] = "3";
            break;
        }

          var tempStr = "";

           result[i] + tempStr;

    }

    return tempStr;

}

var decodeMessage = function(){

}

var promptUser = function(){

    var tempBool = true;

    while(tempBool){
    userInputA = prompt("Type '1' to encode a message and '2' to decode a message!", "Type '1' or '2' here.");

    switch(userInputA){
        case("1"):
            encodeMessage();
            tempBool = false;
        break;
        case("2"):
            decodeMessage();
            tempBool = false;
        break;
        default:
            alert("Try again. Please type a '1' or a '2'.");
    }

    }
}

var printMessage = function(){
    alert(encodeMessage);
}

//LOGIC
promptUser();
printMessage();

</script>
</body>

</html>

Информация: Atm использует пользовательский ввод userInputB и анализирует его на отдельные символы. Затем он устанавливает символы на другой символ (перемешивает символ). Затем он выводит строку пользователю. Моя цель - сделать так, чтобы вы могли ввести сообщение I love this website! и превратить его в 1 2324 5654 7503947. Затем другой пользователь может ввести закодированное сообщение, и функция decodeMessage расшифрует сообщение и выведет его пользователю.

Первая проблема: в настоящее время она не будет работать как есть.*

* РЕДАКТИРОВАТЬ: Теперь, когда я запускаю код после исправления ошибки result[i]. Вывод, который я получаю сейчас

Второй вопрос: Как я могу это сделать (IE. Есть ли лучший способ сделать это)

Любые советы могут помочь. Я нуб в javascript. Спасибо!


person user2406223    schedule 14.01.2014    source источник
comment
не работает немного расплывчато. Чтобы помочь вам: я могу (...), но когда я (...), (ничего не происходит / происходит что-то неожиданное)   -  person Katana314    schedule 14.01.2014
comment
Когда я ввожу «1» в подсказку (для раздела кодировщика программы), он переводит меня в подсказку кодировщика, где я ввожу сообщение. Нажимаю ок и ничего не происходит. ATM «a», «b» и «c» — единственные буквы, которые можно закодировать. Кроме того, раздел декодера еще не сделан.   -  person user2406223    schedule 14.01.2014
comment
Похоже, у вас есть некоторые синтаксические ошибки. Там, где у вас есть result(i), вы должны использовать result[i]. Круглые скобки вызывают функцию, а скобки получают свойство.   -  person Scimonster    schedule 14.01.2014
comment
Я исправил все ошибки, но теперь он выводит код. function(){ var outputStr = ""; userInputB = prompt("Type your message here:", "PLEASE TYPE YOUR MESSAGE IN LOWER CASE!"); for(var i = 0; i <= result.length; i++){ switch(result[i]){ case("a"): result[i] = "1"; break; case("b"): result[i] = "2"; break; case("c"): result[i] = "3"; break; } result[i] + outputStr; } return outputStr; }   -  person user2406223    schedule 14.01.2014
comment
Код в комментарии трудно читать, поэтому, возможно, было бы лучше отредактировать исходный вопрос с новой информацией. Некоторые люди помещают это в новый абзац с предисловием EDIT:   -  person Katana314    schedule 14.01.2014


Ответы (3)


Первая проблема связана с вашим входом; result не будет обновляться, когда пользователь вводит приглашение.

function encodeMessage() {
    var output = '';

    userInputB = prompt(...);
    result = userInputB.split('');
    ...
}

Вторая проблема — это сама кодировка. Вместо использования гигантского switch создайте алгоритм для выполнения кодирования. В вашем случае у вас есть простое сопоставление символа с числом 1: 1, удобно в естественном порядке.

Знаете ли вы, что ваш компьютер хранит эти буквы в виде цифр? 'a' равно 97, 'b' равно 98 и т. д., поэтому вы можете просто вычесть 96 из символа, чтобы получить a = 1, b = 2 и т. д.

Однако это создает проблему для вашего декодера, когда вы достигаете 'j'. «java» превратится в «101221», и если вы просто выполните обратный кодировщик, вы получите «a`abba».

Одним из вариантов может быть возврат к вашей схеме кодирования и таблице ASCII. '1' — это 49-й символ; возможно, вместо этого вы могли бы вычесть 48 из своих персонажей? Затем 'a' станет '1' (немного отличается от 1) и так далее. 'j' становится ':', и если вы закодируете "java", вы получите ":1F1".

Как только вы это сделаете, обратная схема вашей кодировки станет вашим декодером. Переберите закодированную строку и добавьте 48 вместо вычитания.

person Brian S    schedule 14.01.2014

ОБНОВЛЕНИЕ

Я обновил http://jsfiddle.net/ntyt4/5/ пример сценария процесс кодирования и декодирования. Это должно дать вам достаточно, чтобы начать.


Более простым способом было бы использование словаря с ключами и их переведенными значениями. Вы можете сохранить это в литерале объекта как:

var translation = {
    "a": 1,
    "b": 2,
    "c": 3,
    "d": "A"    
};

Я включил jsfiddle, чтобы показать вам пример. Просто измените значение текстового поля на одно значение, чтобы увидеть перевод.

Однако следует иметь в виду, что вам придется добавлять каждый символ, который необходимо перевести, в литерал объекта. Например, «а» не будет переводить для вас версию «А» в верхнем регистре, потому что это другой символ.

person ryanulit    schedule 14.01.2014
comment
Это прекрасно работает, но как вы сможете ввести целую строку текста и перевести ее. - person user2406223; 14.01.2014
comment
Словарь отображения является разумным решением, хотя использовать ту же карту для декодера непросто. - person Brian S; 14.01.2014
comment
Для всей строки текста вы просто зацикливаете символ за символом и продолжаете добавлять к закодированной строке, которую вы возвращаете в конце. Что касается словаря декодирования, у вас может быть функция, изменяющая порядок в новый словарь и декодирующая обратно таким образом. Брайан, перевод таблицы ASCII также неплохая идея, которую люди предпочитают использовать при таком кодировании. - person ryanulit; 14.01.2014

Я не очень хорошо знаю javascript, но у вас есть три варианта:

Сопоставление символов с двумя векторами
Если вы хотите включить простые символы, вам потребуется преобразование 25(a-z)+25(A-Z)+9(0-9)=59. Вы можете сделать это с помощью алгоритма, который, если найдена буква в первом векторе, например, в индексе «6», берет значение из соответствующей позиции во втором векторе.

Декодирование аналогично, только взять из второго вектора и преобразовать его в эквивалент для первого вектора.

Таблица ASCII
Символьная буква '0', преобразованная в целое число, равна 48. От 48 до 57 у вас есть число, в диапазоне 65–90 у вас есть верхний символ, а в диапазоне 97– 122 у вас есть нижний символ. Если вы попытаетесь вычитать, например, два, ваш текст будет закодирован в простой системе.

Алгоритм MD5
Вы можете использовать/создать функцию, которая генерирует md5 хэш текста, например, "кодировка" в md5 - это "84bea1f0fd2ce16f7e562a9f06ef03d3". Если вы хотите использовать систему шифрования для шифрования области, это лучший способ.

person Delayer    schedule 14.01.2014
comment
Хотя md5 является скомпрометированной хеш-функцией и для нее существуют большие радужные таблицы, md5 не является обратимой функцией. Для тех, кому нужно шифрование и расшифровка, md5 — плохой выбор. - person Brian S; 22.01.2014