Äquivalentes zu DWORD bzw unsigned long



  • DWORD ist ja nur ein typedef von "unsigned long" .. aber es gibt ja keine unsigned typen in java, wie könnte ich 'so ne funktion dann in java hinkriegen?

    void cHandShakeApi::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 = (unsigned char)((mut&0xFF)^(mut3&0xFF));
    	unsigned char byte2 = (unsigned char)((mut1&0xFF)^(mut2&0xFF));
    	if( !byte1 ) byte1 = 1;
    	if( !byte2 ) byte2 = 1;
    	byte1seeds[0] = byte1^byte2;
    	byte1seeds[1] = byte2;
    	byte1seeds[2] = byte1;
    }
    


  • unsigned long ist ja "nur" 32 Bit lang. Dafür kann man in Java hilfsweise die Java long-Typen verwenden, die zwar nicht unsigned, dafür aber länger als 32 Bit sind und somit alle 32 Bit unsigned Werte aufnehmen können und damit dann die gleichen Ergenisse liefern wie unsigned Arithmetik wenn man hinterher die ober 32 Bit wieder abschneidet. Zum übertagen von unsigned 32 Bit Werten kannst du auch in Java int-Werte nehmen, die haben ja genug Bits, und dann erst zum Rechnen auf 64 Bit long-Werte gehen.

    void SetupCountByte( int seed )
    {
        if( seed == 0 ) seed = 0x9ABFB3B6;
        long mut = seed & 0xffffffffL; // hier passiert die Umwandlung in unsigned
        long mut1 = GenerateValue( &mut );
        long mut2 = GenerateValue( &mut );
        long mut3 = GenerateValue( &mut );
        GenerateValue( &mut );
        byte byte1 = (byte)((mut&0xFF)^(mut3&0xFF));
        byte byte2 = (byte)((mut1&0xFF)^(mut2&0xFF));
        if( byte1 == 0 ) byte1 = 1;
        if( byte2 == 0 ) byte2 = 1;
        byte1seeds[0] = byte1^byte2;
        byte1seeds[1] = byte2;
        byte1seeds[2] = byte1;
    }
    

    Die GenerateValue( &mut ) Aufrufe gehen natürlich nicht in Java. Da sie offenbar zwei Rückgabewerte haben wirst du sie entweder manuell inlinen müssen oder müsstest deinen Code umstricken, um irgendeine Datenstruktur statt dem Zeiger auf mut übergeben zu können. Also z.B.:

    long[] mut = { seed & 0xffffffffL }; // hier passiert die Umwandlung in unsigned
        long mut1 = GenerateValue( mut );
        long mut2 = GenerateValue( mut );
        long mut3 = GenerateValue( mut );
        GenerateValue( mut );
        byte byte1 = (byte)((mut[0]&0xFF)^(mut3&0xFF));
        byte byte2 = (byte)((mut1&0xFF)^(mut2&0xFF));
    
    ... und dann in GenerateValue statt *mut durch mut[0] ersetzen.
    

    Prinzipiell kannst du die Umwandlung auf long auch erst in GenerateValue machen, falls du da tatsächlich unsigned Arithmetik brauchst. Der Code in SetupCountByte käme auch einfach mit int aus, da die Bitoperatoren ^, | und & bei unsigned und signed Typen das gleiche Ergebnis liefern.


Anmelden zum Antworten