我有以下代码来编码纯文本:
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。
你看到我误解了吗?
答案 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);
}