2013-08-21 2 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로 임시 값을 정의하고, 나는 같은 오류가있어 : 나는 true하지 제로의 C++ 제로는, false 것을 사실과 아무것도 이해C++에 대한 C# 문에 대한

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

합니다. 하지만 여기까지는 내가 보는 한 적용되지 않습니다. 그것에 대해 나에게 힌트를 줄 수 있니?

+0

오류 메시지를 제공 할 때 ** 오류가 발생한 행을 지정해야합니다. – abelenky

답변

5

temp 변수 플래그 (경우 두 경우가 검사된다

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

if ((temp & seed) != 0) 

if ((temp & NC_UDS_KEYMASK) != 0) 

사용해 seed 또는).

0

나는 오류가 여기에있다 생각 :

if (temp & seed) 

temp하지 유형 인 boolean

당신은 if (temp != 0)로 표현을 변경하거나 입력 bool의 또 다른 변수를 만들어야합니다 다음 중 하나

을 예를 들어 bool isTemp;

그 조건부에서.

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 아무것도 변환하지 않습니다. 직접 bool을 만드십시오 : myInt != 0.

C#은 일반적인 코딩 실수를 피하기 위해 약간 더 자세한 정보를 제공합니다.