Python转C#代码转换

时间:2017-01-29 11:55:39

标签: c# python

我正在尝试将下面的python代码行转换为C#:

encoded_c = chr(abs(ord(string[i]) - ord(key_c) % 256))

这是我在C#中得到的:

char encoded_c=(char)Math.Abs((int)decodedString[i] - (int)key_c % 256);

但是,它不会返回相同的结果。我认为它与(int)castings有关,但当我尝试搜索ord()或(int)的其他方法时,它们似乎不起作用。

作为参考,这是整个代码块:

的Python:

def basic_decode(key,string):

    decoded_chars=[]

    string=base64.urlsafe_b64decode(string)

    string=base64.b64decode(string)

    for i in xrange(len(string)):

        key_c=key[i % len(key)]

        encoded_c = chr(abs(ord(string[i]) - ord(key_c) % 256))

        decoded_chars.append(encoded_c)

    decoded_string="".join(decoded_chars)

    return decoded_string

C#:

public string basic_decode(string key,string message)
    {
        List<int> decoded_chars = new List<int>();

        byte[] data = Convert.FromBase64String(message);

        string decodedString = Encoding.UTF8.GetString(data);

        data = Convert.FromBase64String(decodedString);

        decodedString = Encoding.UTF8.GetString(data);

        foreach (int i in Enumerable.Range(0, decodedString.Length))
        {
            char key_c = key[i % key.Length];

            char encoded_c=(char)Math.Abs((int)decodedString[i] - (int)key_c % 256); //this line doesnt return what it's supposed to

            decoded_chars.Add(encoded_c);
        } 
        string decoded_string = string.Join("",decoded_chars);
        return decoded_string;
    }

使用以下命令执行C#功能时

Console.WriteLine(t.basic_decode("test", "NGNybTU5WE0yQT09"));

注意:NGNybTU5WE0yQT09:是一个用编码函数编码的编码字符串(使用python版本,它可以完美地编码和解码)。

返回

6541765432654186541765417643265418

问号指的是:

Console.WriteLine(encoded_c);

位于char encoded_c = ....代码行

何时

print basic_decode("test","NGNybTU5WE0yQT09")

执行后,返回:

ë

取值

取值

ë

消息

消息是正确的解码消息

2 个答案:

答案 0 :(得分:2)

好的,我在转换后的代码中发现了两个问题。首先,第二个Encoding.Unicode.GetString正在抛弃输入。例如,Python代码中第一个字符的整数等价物是225,但在C#代码中它是65533.您可以通过完全跳过第二个编码并使用data来解决这个问题。

第二个是您使用List<int>来存储结果字符。然后,当您使用string.Join创建结果字符串时,您将一堆整数组合成一个字符串,这就是输出是一堆数字的原因。将列表更改为List<char>,它将生成正确的结果。

功能代码:

public string basic_decode(string key, string message)
{
    List<char> decoded_chars = new List<char>();

    byte[] data = Convert.FromBase64String(message);

    string decodedString = Encoding.UTF8.GetString(data);

    data = Convert.FromBase64String(decodedString);

    foreach (int i in Enumerable.Range(0, data.Length))
    {
        char key_c = key[i % key.Length];

        char encoded_c = (char)Math.Abs((int)data[i] - (int)key_c % 256); 

        decoded_chars.Add(encoded_c);
    }

    string decoded_string = string.Join("", decoded_chars);
    return decoded_string;
}

经过测试:

static void Main(string[] args)
{
    string dec = basic_decode("test", "NGNybTU5WE0yQT09");
    Console.WriteLine(dec);
}

// Prints:
// 
// message

答案 1 :(得分:0)

有一个自动的在线转换工具,您可以在这里尝试:

https://pythoncsharp.com/

我想您知道自动转换会带来什么。它可能不会编译,但是将是有效的语法,这对于手动转换是足够好的基础。