C# 带Stringbuilder的C“编码器”

C# 带Stringbuilder的C“编码器”,c#,stringbuilder,C#,Stringbuilder,我正在构建一个程序,它将请求一个字符串,对其进行编码,显示编码文本,然后显示解码文本 我制作了一个大多数键盘字符的字符数组,以及它们的值的字符串数组。例如,字母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',

我正在构建一个程序,它将请求一个字符串,对其进行编码,显示编码文本,然后显示解码文本

我制作了一个大多数键盘字符的字符数组,以及它们的值的字符串数组。例如,字母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();
    }
程序的编码部分工作正常,但解码部分工作不正常。它会一直工作,直到它到达if语句,该语句转换小写的ethe。代码旁边有//e。编码时,输出为10-。但是当它尝试解码10-,而不是字母e时,它输出数字1。看起来解码器没有得到所有的10-,只有第一个字符


关于如何解决此问题,您有什么建议吗?

您的问题是,某些编码字符将在您编写的完整编码匹配之前进行处理

比如说

20-20-10-11-

您的解码将进展为:

2 1 a

因此,您的两位数编码将无法正常处理

为了使用您当前的方法正确地解决这个问题,您需要在比赛中放一个领先的破折号

-10-匹配您的e,替换为-e。除第一个字符应在集合中最后匹配外,其他字符均相同。例如,如果它是3-02,则最后一个字符应在处理完所有其他字符后匹配前3个字符(不带前导破折号)

换句话说,在每次编码时使用前导破折号遍历字符串,然后在不使用前导破折号的情况下运行另一次遍历


注意,您的-字符也会遇到问题-在解码过程中,它会与您的所有数字字符不匹配,这给您的代码带来了其他挑战。

代码的问题是您正在执行一个像TTE.ReplaceCHARS[0]这样的整体替换。ToString,VALS[0]如果你已经替换了一个模棱两可的角色,这会让你感到悲伤

例如,如果字符串为0,则首先用0替换-给出0-0,然后用53替换两个0-得到53-53-,然后用56替换3-给出556--556-,等等。因此,最后,所有替换后,字符串0将变为56191-91-56191-91-56291-91-91-91-91-56191-91-56191-91-56191-91-56291-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-53-作为源代码,我会按预期输出0。

您的代码中有很多问题。从太多代码开始,为什么不使用?参见Ehsan.Saradar答案中的优化,以模棱两可的编码/解码结尾。回到你的问题上来。是每个字符串都有问题,还是只有特定的字符串有问题?请将问题添加到测试字符串中,和请求的输出编码字符串。您的问题是0-在10-之前得到处理,因此第二个从未遇到匹配。您是否设置了StringBuilder和Array,或者您是否愿意使用其他更易于在此处编写代码的选项?您能给我一个示例,说明在此处应如何使用for循环吗?您是否尝试使用该代码其他角色?e、 g.ľšß§您的列表不包含可以在键盘上打印的所有字符。如果文本中至少包含一个不受支持的字符,例如制表符、换行符、国家字符,则代码将崩溃。@Julo-是的,确实如此。似乎OP并不关心这个?我包括了大部分键盘字符。我知道还有其他的,比如你提到的那些,但是在这个例子中我没有包括它们。这个程序主要是一个实验,但如果我分发它,我会包含所有字符。@S.Ferrell-当前标准中定义了137439个字符。把它们都包括进来可能有点不切实际。
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]));
}
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}-"]));
}