1

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Öæ–6to Ö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;
}
4

2 に答える 2

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
于 2013-01-09T14:50:12.833 に答える
1

誤った名前...Encrypt...の関数は根本的なエラーを引き起こします。stringaとして処理するa を取り (問題ありません)、それぞれを achar[]に明示的にキャストします。それが縮小変換です。上位ビットのいずれかが失われ、より異常なsを往復する機能が失われます。この質問を見ると、理解に役立つはずです。charbytechar

この関数を使用して、情報を失うことなくバイトを取得できます。

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;
}

バイト配列は、エンディアンを共有するシステムでラウンドトリップします。


Esailja が述べているように、単純でリトルエンディアンの結果を明示的に返すため、呼び出したほうがよいでしょう

byte[] Encoding.Unicode.GetBytes(string)

同じことを達成するために。

于 2013-01-09T15:13:06.870 に答える