将C#哈希函数转换为C ++

时间:2017-07-09 12:53:16

标签: c# c++

我在C#中有这个功能:

=SUM(IFERROR(C$2:C$20*B$2:B$20/K$2:K$20,0))

我尝试用C ++重写它,我做到了这一点:

public static unsafe int GetMonoHash(string str) {
    unsafe {
        fixed (char* src = str) {
            char* chPtr2 = src; // + offset;
            char* chPtr3 = (chPtr2 + str.Length) - 1;
            int num = 0;
            while (chPtr2 < chPtr3) {
                num = ((num << 5) - num) + chPtr2[0];
                num = ((num << 5) - num) + chPtr2[1];
                chPtr2 += 2;
            }
            chPtr3++;
            if (chPtr2 < chPtr3) {
                num = ((num << 5) - num) + chPtr2[0];
            }
            return num;
        }
    }
}

这引发了编译错误:

int Utils::getMonoHash(std::string str)
{
    char* src = &str[0];
    char* chPtr2 = src; // + offset;
->  char* chPtr3 = (chPtr2 + str.length) - 1;
    int num = 0;
    while (chPtr2 < chPtr3) {
        num = ((num << 5) - num) + chPtr2[0];
        num = ((num << 5) - num) + chPtr2[1];
        chPtr2 += 2;
    }
    chPtr3++;
    if (chPtr2 < chPtr3) {
        num = ((num << 5) - num) + chPtr2[0];
    }
    return num; 
}

所以我将指示的(C3867 'std::basic_string<char,std::char_traits<char>,std::allocator<char>>::length': non-standard syntax; use '&' to create a pointer to member C2297 '+': illegal, right operand has type 'unsigned __int64 (__cdecl std::basic_string<char,std::char_traits<char>,std::allocator<char>>::* )(void) noexcept const' )行更改为

->

这给了我一个新的编译错误(这次只有一个,是的!):

char* chPtr3 = (chPtr2 + (char *)str.length) - 1;

我不知道现在该做什么。当与C#one输入相同时,我需要C ++函数与C#函数具有相同的输出。

我在这做什么?

3 个答案:

答案 0 :(得分:3)

str.length不是属性,它是一个函数,需要()

根据我作为C#程序员的经验,这是C#程序员在编写C ++时最常犯的错误之一。

答案 1 :(得分:2)

在str.length之后不要忘记括号。正确的类型应该是这样的

char* chPtr3 = (chPtr2 + str.length()) - 1;

答案 2 :(得分:1)

你做什么的?你停止“翻译”,好像C ++和C#有任何共同点,并从头开始使用你的基本要求 - 以及你的C ++书籍 - 作为指南。

在这种情况下,您的问题是您使用的成员函数不正确。它是str.length()。编译器的抱怨是关于错误地使用函数名,而没有实际调用它。