给定哈希函数的最佳消息解码方式是什么

时间:2019-03-04 05:01:50

标签: c++ decode

我有一个.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个给我解码后的消息?我一直在思考switch语句,但是我敢肯定还有其他方法比这更有效。谢谢。

2 个答案:

答案 0 :(得分:4)

我总是对初学者程序员提出的任何问题进行红色标记,以寻求“最佳”方式来做某事。

但是我之所以回答是因为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];
}

从那里应该很明显。编码或解码字符所需要做的就是使用该字符的(无符号)值来查找相应的表条目。

此方法可能是最快的基本方法。但无论您的要求是什么,它都不是最好的。

答案 1 :(得分:1)

免责声明:我不是C ++程序员;我不是C ++程序员。我是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 = alphabetto = hashFunc进行编码,反之亦然以进行解码。