解码字符串Char.Parse问题

时间:2014-04-01 13:09:47

标签: c#

我有以下代码来编码纯文本:

int AddNumber;
int AsciiNumber;
string OneChar;
string String1 = "DAVE SMITH";
string String2 = "";
for (int i = 0; i < String1.Length; i++)
{
    AddNumber = i + 95;
    AsciiNumber = (int)Char.Parse(String1.Substring(i,1));

    byte[] NewAscii = new byte[] { Convert.ToByte( AsciiNumber + AddNumber ) };

    // Get string of the NewAscii
    OneChar = Encoding.GetEncoding(1252).GetString(NewAscii);

    String2 = String2 + OneChar;
 }

我遇到的问题是如何将字符串解码回纯文本。这是我的尝试代码:

String1 = "";
for (int i = 0; i < String2.Length; i++)
{
    AddNumber = i + 95;

    AsciiNumber = (int)Char.Parse(String2.Substring(i,1));

    byte[] NewAscii = new byte[] { Convert.ToByte( AsciiNumber - AddNumber ) };

    // Get string of the NewAscii
    OneChar = Encoding.GetEncoding(1252).GetString(NewAscii);

    String1 = String1 + OneChar;
 }

问题在于上面,在处理编码的空白空间(在DAVE和SMITH之间)时,值AsciiNumber =(int)Char.Parse(String2.Substring(i,1))是402,其应该是131。

你看到我误解了吗?

2 个答案:

答案 0 :(得分:3)

通过向空格(ASCII 36)添加95,最终得到字节131.然后在131处询问Windows-1252文本,即a Latin ƒ,并将其存储到C#的本机Unicode字符串中。 C#将把Latinƒ映射回UTF-16以存储到内存中。之后,你要求返回该字符 - 它的Unicode代码点为U+0192;从十六进制转换,你得到十进制402.试图将它返回到Windows-1252显然会失败,因为它不是一个字节。

您可能想要做的是在操作字符之前使用Encoding.GetBytes将Unicode文本转换为Windows-1252

答案 1 :(得分:2)

对于解码部分

        String1 = "";
        for (int i = 0; i < String2.Length; i++)
        {
            var charByte = System.Text.Encoding.GetEncoding(1252).GetBytes(String2.Substring(i, 1));
            AddNumber = i + 95;
            AsciiNumber = Convert.ToInt32(charByte[0]) - AddNumber;
            String1 += Convert.ToChar(AsciiNumber);

        }