我正在尝试将下面的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")
执行后,返回:
米
ë
取值
取值
一
克
ë
消息
消息是正确的解码消息
答案 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)