我正在构建一个程序,该程序将要求一个字符串,对它进行编码,显示编码后的文本,然后显示解码后的文本。
我将大多数键盘字符组成一个char数组,并将其值组成一个字符串数组。例如,字母A等于“ 1-”,字母a等于“ 2-”,依此类推。
这是我尝试使用的内容:
protected internal static readonly char[] CHARS = {' ', 'A', 'a', 'B', 'b', 'C', 'c', 'D', 'd', 'E', 'e', 'F', 'f', 'G', 'g', 'H', 'h', 'I', 'i', 'J', 'j', 'K', 'k', 'L', 'l', 'M', 'm', 'N', 'n', 'O', 'o', 'P', 'p', 'Q', 'q', 'R', 'r', 'S', 's', 'T', 't', 'U', 'u', 'V', 'v', 'W', 'w', 'X', 'x', 'Y', 'y', 'Z', 'z', '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', ',', '.', '/', '<', '>', '?', ':', ';', '\'', '\"', '[', ']', '{', '}', '\\', '|', '`', '~', '!', '@', '#', '$', '%', '^', '&', '*', '(', ')', '-', '_', '=', '+'};
protected internal static readonly string[] VALS = {"0-", "1-", "2-", "3-", "4-", "5-", "6-", "7-", "8-", "9-", "10-", "11-", "12-", "13-", "14-", "15-", "16-", "17-", "18-", "19-", "20-", "21-", "22-", "23-", "24-", "25-", "26-", "27-", "28-", "29-", "30-", "31-", "32-", "33-", "34-", "35-", "36-", "37-", "38-"};
public static string Encode(string TextToEncode)
{
StringBuilder TTE = new StringBuilder(TextToEncode);
#region Encode
if (TTE.ToString().Contains(CHARS[0].ToString()) == true)
{
TTE.Replace(CHARS[0].ToString(), VALS[0]);
}
if (TTE.ToString().Contains(CHARS[1].ToString()) == true)
{
TTE.Replace(CHARS[1].ToString(), VALS[1]);
}
if (TTE.ToString().Contains(CHARS[2].ToString()) == true)
{
TTE.Replace(CHARS[2].ToString(), VALS[2]);
}
if (TTE.ToString().Contains(CHARS[3].ToString()) == true)
{
TTE.Replace(CHARS[3].ToString(), VALS[3]);
}
if (TTE.ToString().Contains(CHARS[4].ToString()) == true)
{
TTE.Replace(CHARS[4].ToString(), VALS[4]);
}
if (TTE.ToString().Contains(CHARS[5].ToString()) == true)
{
TTE.Replace(CHARS[5].ToString(), VALS[5]);
}
if (TTE.ToString().Contains(CHARS[6].ToString()) == true)
{
TTE.Replace(CHARS[6].ToString(), VALS[6]);
}
if (TTE.ToString().Contains(CHARS[7].ToString()) == true)
{
TTE.Replace(CHARS[7].ToString(), VALS[7]);
}
if (TTE.ToString().Contains(CHARS[8].ToString()) == true)
{
TTE.Replace(CHARS[8].ToString(), VALS[8]);
}
if (TTE.ToString().Contains(CHARS[9].ToString()) == true)
{
TTE.Replace(CHARS[9].ToString(), VALS[9]);
}
if (TTE.ToString().Contains(CHARS[10].ToString()) == true)
{
TTE.Replace(CHARS[10].ToString(), VALS[10]);
}
if (TTE.ToString().Contains(CHARS[11].ToString()) == true)
{
TTE.Replace(CHARS[11].ToString(), VALS[11]);
}
if (TTE.ToString().Contains(CHARS[12].ToString()) == true)
{
TTE.Replace(CHARS[12].ToString(), VALS[12]);
}
if (TTE.ToString().Contains(CHARS[13].ToString()) == true)
{
TTE.Replace(CHARS[13].ToString(), VALS[13]);
}
if (TTE.ToString().Contains(CHARS[14].ToString()) == true)
{
TTE.Replace(CHARS[14].ToString(), VALS[14]);
}
if (TTE.ToString().Contains(CHARS[15].ToString()) == true)
{
TTE.Replace(CHARS[15].ToString(), VALS[15]);
}
if (TTE.ToString().Contains(CHARS[16].ToString()) == true)
{
TTE.Replace(CHARS[16].ToString(), VALS[16]);
}
if (TTE.ToString().Contains(CHARS[17].ToString()) == true)
{
TTE.Replace(CHARS[17].ToString(), VALS[17]);
}
if (TTE.ToString().Contains(CHARS[18].ToString()) == true)
{
TTE.Replace(CHARS[18].ToString(), VALS[18]);
}
if (TTE.ToString().Contains(CHARS[19].ToString()) == true)
{
TTE.Replace(CHARS[19].ToString(), VALS[19]);
}
if (TTE.ToString().Contains(CHARS[20].ToString()) == true)
{
TTE.Replace(CHARS[20].ToString(), VALS[20]);
}
#endregion
return TTE.ToString();
}
解码方法:
public static string Decode(string EncodedText)
{
StringBuilder TTD = new StringBuilder(EncodedText);
#region Decode
if (TTD.ToString().Contains(VALS[0]) == true) // [space]
{
TTD.Replace(VALS[0], CHARS[0].ToString());
}
if (TTD.ToString().Contains(VALS[1]) == true) // A
{
TTD.Replace(VALS[1], CHARS[1].ToString());
}
if (TTD.ToString().Contains(VALS[2]) == true) // a
{
TTD.Replace(VALS[2], CHARS[2].ToString());
}
if (TTD.ToString().Contains(VALS[3]) == true) // B
{
TTD.Replace(VALS[3], CHARS[3].ToString());
}
if (TTD.ToString().Contains(VALS[4]) == true) // b
{
TTD.Replace(VALS[4], CHARS[4].ToString());
}
if (TTD.ToString().Contains(VALS[5]) == true) // C
{
TTD.Replace(VALS[5], CHARS[5].ToString());
}
if (TTD.ToString().Contains(VALS[6]) == true) // c
{
TTD.Replace(VALS[6], CHARS[6].ToString());
}
if (TTD.ToString().Contains(VALS[7]) == true) // D
{
TTD.Replace(VALS[7], CHARS[7].ToString());
}
if (TTD.ToString().Contains(VALS[8]) == true) // d
{
TTD.Replace(VALS[8], CHARS[8].ToString());
}
if (TTD.ToString().Contains(VALS[9]) == true) // E
{
TTD.Replace(VALS[9], CHARS[9].ToString());
}
if (TTD.ToString().Contains(VALS[10]) == true) // e
{
TTD.Replace(VALS[10], CHARS[10].ToString());
}
if (TTD.ToString().Contains(VALS[11]) == true) // F
{
TTD.Replace(VALS[11], CHARS[11].ToString());
}
if (TTD.ToString().Contains(VALS[12]) == true) // f
{
TTD.Replace(VALS[12], CHARS[12].ToString());
}
if (TTD.ToString().Contains(VALS[13]) == true) // G
{
TTD.Replace(VALS[13], CHARS[13].ToString());
}
if (TTD.ToString().Contains(VALS[14]) == true) // g
{
TTD.Replace(VALS[14], CHARS[14].ToString());
}
if (TTD.ToString().Contains(VALS[15]) == true) // H
{
TTD.Replace(VALS[15], CHARS[15].ToString());
}
if (TTD.ToString().Contains(VALS[16]) == true) // h
{
TTD.Replace(VALS[16], CHARS[16].ToString());
}
if (TTD.ToString().Contains(VALS[17]) == true) // I
{
TTD.Replace(VALS[17], CHARS[17].ToString());
}
if (TTD.ToString().Contains(VALS[18]) == true) // i
{
TTD.Replace(VALS[18], CHARS[18].ToString());
}
if (TTD.ToString().Contains(VALS[19]) == true) // J
{
TTD.Replace(VALS[19], CHARS[19].ToString());
}
if (TTD.ToString().Contains(VALS[20]) == true) // j
{
TTD.Replace(VALS[20], CHARS[20].ToString());
}
#endregion
return TTD.ToString();
}
程序的编码部分可以正常工作,但是解码却不能。它一直有效,直到到达转换小写e的if语句为止(代码旁边带有“ // e”)。编码后,输出为“ 10-”。但是,当它尝试解码“ 10-”而不是字母e时,它将输出数字1。看起来解码器并没有获得所有“ 10-”,而只是第一个字符。
关于如何解决此问题的任何建议?
答案 0 :(得分:1)
您的问题是,在您编写完整的“编码”之前,将对某些“编码”字符进行处理。
例如
“ 20-20-10-11-”
解码过程中的进展如下:
“ 2 2 1 1A”
因此,您的两位数编码将无法正确处理。
要使用当前的方法正确解决此问题,您需要在比赛中加一个前导破折号。
您的“ e”的“ -10-”匹配项替换为“ -e”。除了第一个匹配项外,所有内容均相同,例如,如果该匹配项是“ 3-02-”,则最后一个匹配所有第一个“ 3-”,但不带前划线“-”其他已经处理。
换句话说,使用带有每种编码的前导破折号浏览字符串,然后在不使用前导破折号的情况下运行另一遍。
请注意,您的“-”字符也会遇到问题-在解码过程中,它会与所有数字“字符”不匹配,从而带来其他挑战。
答案 1 :(得分:1)
您的代码存在问题,因为您正在执行像TTE.Replace(CHARS[0].ToString(), VALS[0])
这样的大范围替换,如果您已经进行了替换,导致字符不明确,则会使您感到悲伤。
例如,如果您使用字符串" 0"
,则应首先将" "
替换为"0-"
,然后给"0-0"
,然后将两个{{1 }},将"0"
产生"53-"
,然后将"53--53-"
替换为"3"
,得到"56-"
,依此类推。因此,最后,在所有替换之后,字符串"556---556--"
将变成" 0"
。
您需要做的是遍历文本以进行转换,并将每个字符映射一次。方法如下:
"56191-91-56191-91-56291-91-91-91-91-56191-91-56191-91-56291-91-91-91-"
这将正确地将protected internal static readonly char[] CHARS = " AaBbCcDdEeFfGgHhIiJjKkLlMmNnOoPpQqRrSsTtUuVvWwXxYyZz0123456789,./<>?:;\'\"[]{}\\|`~!@#$%^&*()-_=+".ToCharArray();
public static string Encode(string textToEncode)
{
var map = CHARS.Select((c, n) => new { c, v = $"{n}-" }).ToDictionary(x => x.c, x => x.v);
return String.Join("", textToEncode.Select(x => map[x]));
}
映射到" 0"
。
现在,反向操作几乎一样简单。由于编码引入了"0-53-"
,因此只需将编码的字符串除以-
,然后从数字映射即可。
-
如果我将public static string Decode(string textToDecode)
{
var map = CHARS.Select((c, n) => new { c, v = $"{n}-" }).ToDictionary(x => x.v, x => x.c);
return String.Join("", textToDecode.Split(new [] { '-' }, StringSplitOptions.RemoveEmptyEntries).Select(x => map[$"{x}-"]));
}
用作来源,则会按预期得到"0-53-"
。