将C++函数转换为 C#(字符串问题)

Converting C++ Function to C# (String problems)

本文关键字:字符串 问题 C++ 函数 转换      更新时间:2023-10-16

我正在尝试将代码从C++转换为 C#,但我无法做到这一点......

std::string Cipher(std::string Str) 
{
    char Key[5] = { 'H', 'S', 'M', 'K', 'V' };
    std::string Encrypted = Str;
    for (unsigned int i = 0; i < Str.size(); i++) 
    {
        Encrypted[i] = Str[i] ^ Key[i % (sizeof(Key) / sizeof(char))];
    }
    return Encrypted;
}

到目前为止,我在 C# 中得到的是这样的:

    public string Cipher(string Str)
    {
        char[] Key = new char[5] { 'H', 'S', 'M', 'K', 'V' };
        string Encrypted = Str;
        for(int i = 0; i < Str.Length; i++)
        {
            Encrypted[i] = Str[i] ^ Key[i % ((Marshal.SizeOf(Key)) / sizeof(char))]; //line 29
        }
        return Encrypted;
    }

但是我不断收到此错误:

Property or indexer 'string.this[int]' cannot be assigned to -- it is read only (on line 29)

我发现它与字符串的不变性有关,所以我尝试了这个:

    public string Cipher(string Str)
    {
        char[] Key = new char[5] { 'H', 'S', 'M', 'K', 'V' };
        string Encrypted = Str;
        StringBuilder sb = new StringBuilder(Encrypted);
        for (int i = 0; i < Str.Length; i++)
        {
            sb[i] = Str[i] ^ Key[i % ((Marshal.SizeOf(Key)) / sizeof(char))]; //line 30
        }
        return Encrypted;
    }

但是,现在我收到此错误:

Cannot implicitly convert type 'int' to 'char'. An explicit conversion exists (are you missing a cast?) (on line 30)

有人可以帮忙吗?

谢谢

关闭!你使用StringBuilder是正确的。但是,^ -运算符(按位 XOR(使 C# 将结果作为 int。既然你知道它仍然是一个字符,只需添加 cast:

for (int i = 0; i < Str.Length; i++)
{
    sb[i] = (char)(Str[i] ^ Key[i % ((Marshal.SizeOf(Key)) / sizeof(char))]); //line 30
}

另外,我不确定这是否与C++实现完全相同。 (sizeof(Key) / sizeof(char)基本上是数组的长度。所以你应该在 C# 实现中使用 Key.length。所以更准确的是

for (int i = 0; i < Str.Length; i++)
{
    sb[i] = (char)(Str[i] ^ Key[i % Key.Length]); //line 30
}

替换

Encrypted[i] = Str[i] ^ Key[i % ((Marshal.SizeOf(Key)) / sizeof(char))]; //line 29

Encrypted[i] = Str[i] ^ Key[i % Key.Lenght]; //line 29

您可以将字符串中的字符替换为:

"1234567890123".Remove(9,1).Insert(9,"A")

不过,使用字符串生成器是一个更明智的选择。