문제

C ++에서 할 수있는 방법은 이상하지만 C#에서는 그렇지 않습니다.

명확하게하기 위해 두 기능을 C ++에 붙여 넣은 다음 C#에 붙여 넣은 다음 C# 코드에 문제가있는 줄을 주석 "// error"로 표시합니다. 두 기능이하는 일은 매개 변수를 인코딩 한 다음 Byte1Seeds라는 글로벌 변수에 추가하는 것입니다.

이것들은 C ++의 함수입니다

//Global var:

unsigned char byte1seeds[3];

unsigned long GenerateValue( unsigned long * Ptr )
{
unsigned long val = *Ptr;
for( int i = 0; i < 32; i++ )
    val = (((((((((((val >> 2)^val) >> 2)^val) >> 1)^val) >> 1)^val) >> 1)^val)&1)|((((val&1) << 31)|(val >> 1))&0xFFFFFFFE);
return ( *Ptr = val );
}

void SetupCountByte( unsigned long seed )
{
if( seed == 0 ) seed = 0x9ABFB3B6;
unsigned long mut = seed;
unsigned long mut1 = GenerateValue( &mut );
unsigned long mut2 = GenerateValue( &mut );
unsigned long mut3 = GenerateValue( &mut );
GenerateValue( &mut );
unsigned char byte1 = (mut&0xFF)^(mut3&0xFF);
unsigned char byte2 = (mut1&0xFF)^(mut2&0xFF);
if( !byte1 ) byte1 = 1;
if( !byte2 ) byte2 = 1;
byte1seeds[0] = byte1^byte2;
byte1seeds[1] = byte2;
byte1seeds[2] = byte1;
}

이제 C# 코드 :

generatevalue.instead의 기능을 매개 변수로 변경 한 결과 Ulong 매개 변수가 있습니다.

그것을 호출하고 내가 사용하는 두 값을 변경하려면 :

  1. ulong mut1 = generatevalue (mut);
  2. mut = mut1;

번역 된 함수는 다음과 같습니다 (문제가있는 선에는 "// error"가 표시됨);

//Global var:
public static byte[] byte1seeds = new byte[3];

public static ulong GenerateValue(ulong val)
{
    for( int i = 0; i < 32; i++ )
        val = (((((((((((val >> 2)^val) >> 2)^val) >> 1)^val) >> 1)^val) >> 1)^val)&1)|((((val&1) << 31)|(val >> 1))&0xFFFFFFFE);
    return val ;
}

public static void SetupCountByte( uint seed )
{
    if( seed == 0 ) seed = 0x9ABFB3B6;
    ulong mut = seed;
    ulong mut1 = GenerateValue(mut);
    mut = mut1;
    ulong mut2 = GenerateValue(mut);
    mut = mut2;
    ulong mut3 = GenerateValue(mut);
    mut = mut3;
    mut = GenerateValue(mut);
    byte byte1 = (mut & 0xFF) ^ (mut3 & 0xFF); //error
    byte byte2 = (mut1 & 0xFF) ^ (mut2 & 0xFF); //error
    if( byte1 != 0 )
        byte1 = 1;
    if( byte2 != 0 )
        byte2 = 1;
    byte1seeds[0] = byte1^byte2; //error
    byte1seeds[1] = byte2;
    byte1seeds[2] = byte1;
}

오류 오차는 다음과 같습니다. 오차는 다음과 같습니다. 오차는 다음과 같습니다.

유형 'ulong'을 '바이트'로 암시 적으로 변환 할 수 없습니다. 명백한 전환이 존재합니다 (캐스트가 놓치고 있습니까?)

편집 : 문제가있는 행 3의 오류는 다음과 같습니다.

유형 'int'를 '바이트'로 암시 적으로 변환 할 수 없습니다. 명백한 전환이 존재합니다 (캐스트가 놓치고 있습니까?)

여기에 질문이 있습니다 : 이러한 오류를 해결하는 방법은 무엇입니까?

미리 감사드립니다!

도움이 되었습니까?

해결책

을 추가하다 (byte) 캐스팅하기 위해. 정밀도를 잃을 수 있으므로 컴파일러에게 값이 바이트에 맞을 것이라고 말해야합니다.

byte byte1 = (byte)((mut & 0xFF) ^ (mut3 & 0xFF));
byte byte2 = (byte)((mut1 & 0xFF) ^ (mut2 & 0xFF));

다른 팁

정보를 잃을 수 있습니다. 컴파일러는 그에게 명시 적으로 그렇게하라고 말하지 않는 한 이런 종류의 작업을 허용하지 않습니다. 그러니 다음과 같은 것을 시도하십시오.

byte result = ((byte)mut & 0xFF) ^ ((byte)mut3 & 0xFF);

이런 식으로 모든 변수는 명시 적으로 캐스팅되며 결과는 바이트가됩니다. 또는 이것을 할 수 있습니다 :

byte result = (byte)((mut & 0xFF) ^ (mut3 & 0xFF));

징후

다음 코드는 C ++에서 컴파일하지만 C# 컴파일러에 의해 거부되며 세 번째 줄보고 유형 비 호환성.

ulong mut = 5;
ulong mut3 = 6;
byte foo = (mut & 0xFF) ^ (mut3 & 0xFF);

설명

표현식 (mut & 0xFF) ^ (mut3 & 0xFF) 유형입니다 ulong 변수 유형에 할당 할 수 없습니다 byte.

변수 mut a ulong. 모든 과부하 & 표현식에서 피연산자 유형 대칭이 필요합니다 (mut & 0xFF), 가치 0xFF 홍보됩니다 ulong, 및 작업 결과에는 유형이 있습니다. ulong.

비슷한 프로세스는 두 번째 하위 표현에 유형을 제공합니다. ulong, 이것은 더 큰 표현에서 부수적입니다 A ^ B, 그 표현 A 유형이 있습니다 ulong 표현을 유발할 것입니다 B 홍보됩니다.

따라서 표현 (mut & 0xFF) ^ (mut3 & 0xFF) 유형입니다 ulong 변수 유형에 할당되기 전에 명시적인 캐스트가 필요합니다. byte.

해결책

할당하기 전에 전체 표현식을 명시 적으로 표현합니다.

발언

대부분의 C+ 라이브러리는 결함이 있기 때문에 사람들은 경고를 생각하는 대신 경고를 꺼냅니다. 당신이 경고를 다시 전환한다면, 당신은 너무 많은 사람들이 그들을 통과하려고 노력하는 것은 쓸모가 없지만, 엉망의 어딘가에도 "잠재적으로 손실 된 내재 된 타입 캐스트가 필요하다"는 효과에 대한 메모가있을 것입니다.

C# 언어 사양을 읽고 특히 연산자와 관련하여 많은 유용한 것들을 배울 것입니다. 예를 들어이 코드는 실패합니다.

byte b = 0xF0 | 0x0E; //b should contain 0xFE

그러나 이것들은 성공할 것입니다 :

byte b1 = (byte)(0xF0 | 0x0E); //typecast fixes it
byte b2 = 0xF0;
b2 |= 0x0E; //reflexive operator typed by target variable

"명시적인 변환이 존재한다"는 명시 적 캐스트를해야한다는 것을 나타냅니다. 이 경우 다음과 같은 것입니다.

byte byte1 = (byte) ( (mut & 0xFF) ^ (mut3 & 0xFF) );
byte byte2 = (byte) ( (mut1 & 0xFF) ^ (mut2 & 0xFF) );

거기에 MSDN 지식베이스 기사 그것은 명백한 다운 캐스트의 필요성을 심층적으로 설명합니다. 오류 메시지에 "명시적인 변환이 존재한다"라는 단어는 캐스트를 사용하여 데이터 유형을 명시 적으로 변환해야한다는 단서가되기위한 것입니다. 특정한 경우에는 다음과 같습니다.

byte byte1 = (byte) ( (mut & 0xFF) ^ (mut3 & 0xFF) );
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top