funkcja w C -> C#

0

Witam
wiem że to troche nie zgodne z regulaminem forum ale jż nie wydaje :(

bawie się z gaduGadu i mam funkcje hash'ującą zapisaną w C

int gg_login_hash(unsigned char *password, unsigned int seed)
{
	unsigned int x, y, z;

	y = seed;

	for (x = 0; *password; password++) {
		x = (x & 0xffffff00) | *password;
		y ^= x;
		y += x;
		x <<= 8;
		y ^= x;
		x <<= 8;
		y -= x;
		x <<= 8;
		y ^= x;

		z = y & 0x1f;
		y = (y << z) | (y >> (32 - z));
	}

	return y;
}

chce to przełozyćna C# kombinuje na różne sposoby i ni holery już nie wydaje :/
czepia się przesunięcia bitowego << >> , * , niewszystkie typy tam podane sąw C#
no i chyba jest maly błąd w x = (x & 0xffffff00) | *password;

Jeżeli ktoś by mógl to poprawić tak by robilo w c# był bym dozgonie wdzięczny !!!
Z GÓRY WIELKIE DZIEKI [!!!]

0

Nie ma wskaznikow w C#, jakbys poczytal jakis kurs to bys wiedzial, uzyj jakiegos string czy co tam jest...

0

Czy aby na pewno nie ma wskaźników w C# ?
Są, tylko aby ich użyć trzeba wyraźnie poinformować o tym kompilator. Taki kod nazywa się niebezpiecznym i oznacza kwalifikatorem unsafe. Nie mam teraz dostępu do kompilatora, ale prawdopodobnie wystarczy wstawić słówko unsafe przed podaną wyżej funkcją, by ta działała prawidłowo.

0

no w c# są wskźniki nawet w kursie co mam jest wymieniony w operatorach

jak dałem unsafe przed funkcją to działa tylko jeszcze musze gdzieć przy opcjach kompilacji podać "/unsafe" bo sie czepia o to
DZIĘKI !!

a jak sie ma sprawa typów zmiennych
unsigned char - z tym się nigdy nie zpotkałem w c++ (char z unsigned)

0

no ok działa unsafe [browar]

unsigned int zmieniłem na System.UInt32

ale niestety przy:
<< i >>

Operator '<<' cannot be applied to operands of type 'uint' and 'uint'

dlaczego ??

zmienna seed musi być typu System.UInt32 a funkcja nie może zwrócić wartości typu System.UInt32 [???]

0

dobra mam coś takiego i kompiluje bez blędów tylko czy bedzie dzialać poprawnie ?

unsafe
int gg_login_hash(System.Char *password, System.UInt32 seed)
{
	System.UInt32 x, y, z;

	y = seed;

	for (x = 0; *password != null; password++) {
		x = (x & 0xffffff00) | *password;
		y ^= x;
		y += x;
		x <<= 8;
		y ^= x;
		x <<= 8;
		y -= x;
		x <<= 8;
		y ^= x;

		z = y & 0x1f;
        y = (y << Convert.ToInt32(z)) | (y >> Convert.ToInt32((32 - z)));
	}
    return Convert.ToInt32(y);
}

1 użytkowników online, w tym zalogowanych: 0, gości: 1