C#编码转换

时间:2013-01-09 14:18:28

标签: c# encoding

我在c ++中有一个加密例程,我把它翻译成C#:

示例:

public void main()
{
    string myPwd = "ÖFÖæ6";
    string pwdCoded = XEncrypt.EncryptData_Patch_x_Net(myPwd);
    //Result OK: ÖFÖæ–6
}

public static string EncryptData_Patch_x_Net(string Data)
{
    byte[] bytes = new byte[Data.Length];

    for (int n = 0; n < Data.Length; n++)
    {
        bytes[n] = (byte)Data[n];
    }

    System.Text.Encoding MyEncoding = System.Text.Encoding.Default;
    String MyResult = MyEncoding.GetString(bytes);
    return MyResult;
}

我需要制作反转例程,使其转换为:

ÖFÖæ–6 ÖFÖæ6 (请注意左侧字符串中有短划线)

我做了最后一个功能,但错误地执行了编码

public static string DecryptData_Patch_x_Net(string Data)
{
    byte[] bytes = new byte[Data.Length];

    for (int n = 0; n < Data.Length; n++)
    {
        bytes[n] = (byte)Data[n];
    }

    System.Text.Encoding MyEncoding = System.Text.Encoding.GetEncoding(1252);
    String MyResult = MyEncoding.GetString(bytes);
    return MyResult;
}

2 个答案:

答案 0 :(得分:5)

这不是加密,你真的很复杂。

Encoding iso88591 = Encoding.GetEncoding(28591);
Encoding w1252 = Encoding.GetEncoding(1252);

//
string pwd = "ÖFÖæ\u00966"; //The SPA control character will not survice a Stackoverflow post
                            //So I use \u0096 to represent it

string result = w1252.GetString(iso88591.GetBytes(pwd)); //"ÖFÖæ–6"

string original = iso88591.GetString(w1252.GetBytes(result)); //"ÖFÖæ6" with the hidden control character before 6

Console.WriteLine(result == "ÖFÖæ–6"); //True
Console.WriteLine(original == "ÖFÖæ\u00966"); //True

答案 1 :(得分:1)

您的错误名称...Encrypt...功能会产生根本性错误。您将string视为char[](很好),然后将每个char明确地投放到byte。这是一个缩小的转换。你将失去任何高位和往返更奇怪char的能力。如果你看一下this question,应该有助于理解。

您可以使用此函数获取字节而不会丢失信息,

static byte[] GetBytes(string str)
{
    byte[] bytes = new byte[str.Length * sizeof(char)];
    System.Buffer.BlockCopy(str.ToCharArray(), 0, bytes, 0, bytes.Length);
    return bytes;
}

字节数组将在共享endianess的系统上往返。


正如Esailija所说的那样,因为它简单而且会明确地返回小端结果,你最好不要打电话

byte[] Encoding.Unicode.GetBytes(string)

To achieve the same.