Каков наилучший способ декодирования сообщения с помощью хэш-функции - PullRequest
0 голосов
/ 04 марта 2019

У меня есть файл .txt с закодированным сообщением, чтобы расшифровать его, нужно переключить определенные символы на символы в алфавите.(Это как буква x, указывающая на букву y), а затем использовать ее для декодирования сообщения из файла .txt.У меня есть алфавит, хранящийся в c-строке:

const int ALPHA_SIZE = 26;

char alphabet[ALPHA_SIZE] = { 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l',
    'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x',
    'y', 'z' };

Тогда соответственно буквы, которые соответствуют алфавиту

char hashFunc[ALPHA_SIZE] = {'i', 'z', 't', 'o', 'h', 'n', 'd', 'b', 'e', 'q', 'r', 'k',
    'g', 'l', 'm', 'a', 'c', 's', 'v', 'w', 'f', 'u', 'y', 'p', 'x'};

Теперь мой текстовый файл имеет следующее:

ifqkwxcadf ar cei fpoi masif cd cei xkdqirr du pxxnwafm pf pnmdkaceo cd p oirrpmi, teaqe rqkpohnir cei gpcp af ac-oplafm ac sikw gauuaqvnc pfg caoi qdfrvoafm, au fdc xkpqcaqpnnw aoxdrrahni, cd gigvqi cei dkamafpn masif dfnw cei ifqdgig gpcp. afxvcr cd cei pnmdkaceo cwxaqpnnw afsdnsi pggacadfpn riqkic gpcp qpnnig liwr, teaqe xkisifcr cei oirrpmi ukdo hiafm giqdgig-isif au cei pnmdkaceo ar xvhnaqnw lfdtf.

Как мне соотнести эти 3, чтобы получить декодированное сообщение?Я продумывал заявление о переключении, но я уверен, что есть другой способ более эффективный, чем этот.Спасибо.

Ответы [ 2 ]

0 голосов
/ 04 марта 2019

Я всегда отмечаю любой вопрос от начинающего программиста, спрашивающего «лучший» способ что-то сделать.

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

На самом деле ваша проблема - просто проблема отображения.Все, что вы делаете, это сопоставление одного персонажа с другим.Так что просто постройте стол.Если вы используете 99,9999% современных компьютеров, вы будете иметь дело с 8-битными символами (мы должны игнорировать UTF-8, но на самом деле это также будет совместимо с UTF-8).

char encode[256], decode[256];
for (int i = 0; i < 256; i++) encode[i] = decode[i] = (char)i;
for (int i = 0; i < ALPHA_SIZE; i++) {
    encode[(unsigned char)alphabet[i]] = hashFunc[i];
    decode[(unsigned char)hashFunc[i]] = alphabet[i];
}

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

Этот метод, вероятно, является базовым подходом fasttest .Но это может быть не лучший для любых ваших требований.

0 голосов
/ 04 марта 2019

Отказ от ответственности: я не программист C ++;Я программист на Си.Но этот ответ будет работать как для C, так и для C ++.

Вместо того, чтобы использовать обозначение массива (то есть с фигурными скобками) для инициализации ваших массивов, вы должны использовать реальные строки C.То есть:

char alphabet[] = "abcdefghijklmnopqrstuvwxyz";
char hashFunc[] = "iztohndbeqrkglmacsvwfuypxj";

(Ваш исходный hashFunc отсутствовал j; я полагаю, это ошибка транскрипции. Я добавил ее в конце.)

Таким образом, вы можетелегко конвертировать из одного «алфавита» в другой:

void convert_alphabets (char * str, const char * from, const char * to) {
  const char * found;
  while (*str) {
    found = strchr(from, *str);
    if (found)
      *str = to[found - from];
    str ++;
  }
}

(Вам нужно будет включить <string.h>, чтобы получить strchr(), или <cstring> в C ++, если вы предпочитаете пространство имен std::версия.)

Эта функция просто просматривает каждый символ в строке from и, если находит, заменяет его эквивалентным символом в строке to (обратите внимание, что found будет указывать напозиция, в которой был найден символ, и, таким образом, found - from даст вам индекс в from строку / массив).Вы можете вызвать его с помощью from = alphabet и to = hashFunc для кодирования или наоборот для декодирования.

...