2013-08-21 29 views
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語句中的臨時值。 我定義臨時值作爲uint,和我一樣的錯誤:C++到c#語句

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

我明白一個事實是,在C++零爲false,以及任何不爲零的true。 但是,在我看來,這並不適用。你能給我一個暗示嗎?

+0

當您提供錯誤消息時,您必須**指定錯誤發生在哪條線上。 – abelenky

回答

5

嘗試

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

if ((temp & seed) != 0) 

if ((temp & NC_UDS_KEYMASK) != 0) 

兩個如果檢查所述temp變量有一個標誌(seedNC_UDS_KEYMASK)。

0

我相信錯誤是在這裏:

if (temp & seed) 

temp類型不是boolean

你將不得不表達改變if (temp != 0)或創建bool類型的另一個變量:

例如bool isTemp;

和ch在有條件的情況下。

if (isTemp) { } 
+1

錯誤也出現在'for'循環中,使用'temp'作爲條件。用'temp!= 0'代替。沒有必要創建一個布爾變量。 – Rotem

+1

問題不是'temp'不是'boolean',問題是'temp&seed'不是'boolean'。 [這個答案](http://stackoverflow.com/a/18357686/1711796)有正確的想法。 – Dukeling

+0

@Dukeling - 您可以使用'&'作爲布爾運算符,它只會短路。 –

7

在C++中,整數可用於if語句。在C#中,只能使用評估爲bool的表達式。您的表達temp & seed不計算爲布爾值。你應該在C#中更改條件:

if(0 != (temp & seed)) {} 
3

C#不任何轉換爲​​bool含蓄。自己創建布爾:myInt != 0

C#這樣做是爲了避免常見的編碼錯誤,代價是略微冗長。