1
unsigned long uds_calc_key(unsigned long seed)
{
    unsigned long temp;
    unsigned short int  index;
    unsigned short int  mult1;
    unsigned short int  mult2;

    if(seed == 0)
    {
        seed = NC_DEFAULT_SEED;
    }
    else
    {}

    for (index=0x5D39, temp=0x80000000; temp; temp>>=1)
    {
        if (temp & seed)
        {
            index = croshortright(index, 1);
            if (temp & NC_UDS_KEYMASK)
            {
                index ^= 0x74c9;
            }
        }
    }

    mult1 = (nc_uds_keymul[(index>>2) & ((1<<5)-1)]^index);
    mult2 = (nc_uds_keymul[(index>>8) & ((1<<5)-1)]^index);
    temp = (((unsigned long)mult1)<<16)|((unsigned long)mult2);
    temp = mulu32(seed,temp);
    return temp;
}

我不明白如何在 for 语句中转换该临时值。我将 temp 值定义为uint,但出现如下错误:

Cannot implicitly convert type 'uint' to 'bool';

我理解在 C++ 中一个零是false,而任何不是零的都是true。但据我所知,这并不适用。你能给我一个提示吗?

4

4 回答 4

7

在 C++ 中,整数可以在if语句中使用。在 C# 中,您只能使用计算结果为bool. 您的表达式temp & seed不会计算为布尔值。您应该将 C# 中的条件更改为:

if(0 != (temp & seed)) {}
于 2013-08-21T12:40:44.277 回答
5

尝试

for (index=0x5D39, temp=0x80000000; temp != 0; temp>>=1)

if ((temp & seed) != 0)

if ((temp & NC_UDS_KEYMASK) != 0)

这两个 if 正在检查temp变量是否具有标志(seedNC_UDS_KEYMASK)。

于 2013-08-21T12:40:22.883 回答
3

C# 不会bool隐式转换任何内容。自己创建布尔值:myInt != 0.

C# 这样做是为了避免常见的编码错误,但代价是稍微冗长一些。

于 2013-08-21T12:40:50.980 回答
0

我相信错误在这里:

if (temp & seed)

temp不是类型boolean

您必须将表达式更改为if (temp != 0)或创建另一个类型的变量bool

例如bool isTemp;

并在条件中检查。

 if (isTemp) { }
于 2013-08-21T12:37:24.607 回答