Anzeige:
Ergebnis 1 bis 5 von 5

Thema: #define mag mich nicht

  1. #1
    Registrierter Benutzer
    Registriert seit
    14.02.2001
    Beiträge
    15

    #define mag mich nicht

    Es geht um diesen define hier:
    Code:
    #define c2l(c,l)	(l =((DES_LONG)(*((c)++)))    , \
    			 l |=((DES_LONG)(*((c)++)))<< 8L, \
    			 l |=((DES_LONG)(*((c)++)))<<16L, \
    			 l |=((DES_LONG)(*((c)++)))<<24L)
    Dabei soll eine unsingend char[] zu einer unsigned long gewandelt werden.

    Der Code dazu ist folgender:

    Code:
    DES_LONG tout0;   // Hier handelt es sich um einen __u32
    unsigned char *iv;  
    
    c2l(iv,tout0);
    Das ganze ist nicht auf meinem Mist gewachsen, sondern kommt in Krypto-Progs (hier DES, aus OpenSSL genommen) vor.

    Compilerlauf = ok!
    Programmlauf = ok!

    Aber bei dieser c2l(); hört er einfach auf und macht scheinbar unbeirrt weiter ?!?




    [snip]




    Verstehe ich wenigstens das hier richtig?

    Code:
     l|=((DES_LONG)(*((c)++)))<< 8L, \


    l = l Oderverknüpft mit dem was beim Cast von dem unsingned char rauskommt und um 8bit geshifted?
    Aber was ist das "L"?

  2. #2
    Registrierter Benutzer
    Registriert seit
    24.06.2003
    Beiträge
    486
    Zitat Zitat von maxxle
    Aber bei dieser c2l(); hört er einfach auf und macht scheinbar unbeirrt weiter ?!?
    Mit dieser Fehlerbeschreibung kann ich garnichts anfangen.
    Was heißt er macht weiter?Endlosschleife?

    Minimales Testprogramm
    Code:
    #include <stdio.h>
    
    typedef unsigned long DES_LONG;
    
    #define c2l(c,l) (l =((DES_LONG)(*((c)++))) , \
                          l |=((DES_LONG)(*((c)++)))<< 8L, \
                          l |=((DES_LONG)(*((c)++)))<<16L, \
                          l |=((DES_LONG)(*((c)++)))<<24L)
    
    
    int main()
    {
        DES_LONG l;
        unsigned char array[] = {4,3,2,1};
    
        unsigned char *c = array;
    
        c2l(c,l);
    
        printf("%lu\n",l);
    
        return 0;
    }
    Verstehe ich wenigstens das hier richtig?
    l = l Oderverknüpft mit dem was beim Cast von dem unsingned char rauskommt und um 8bit geshifted?
    Die Idee ist doch, daß du ein char Array hast, also 4 * 8 Bit, die du auf einen unsigned long (32 Bit) verteilen willst.
    Die erste Position des Arrays wird zur den unteren 8 Bit, die zweite Position des Arrays wird um 8 Bit nach links verschoben (also rechts mit Nullen aufgefüllt), und dann mit dem bisherigen Ergebnis verodert, usw...
    Aber was ist das "L"?
    Das sagt dem Compiler nur, daß er die 8 (bzw. 16, 24), nicht als int (was er normalerweise tun würde) interpretieren soll, sondern als long.

  3. #3
    Registrierter Benutzer Avatar von Boron
    Registriert seit
    07.01.2002
    Beiträge
    827
    Und warum überhaupt ein #define benutzen? Ist so nicht widerlich?

    Wenn, dann würde halt eine Funktion daraus machen.
    Wenn man diese Funktion dann noch inline deklariert, dann spart man sich auch den Funktionsaufruf, aber es ist halt bedeutend schöner als ein #define.

    Ich denke, dass du dann auch besser debuggen kannst wegen diesem doofen Fehlverhalten.
    Gruß Boron (der sich oft wegen mieser Rechtschreibung anderer die Augen reiben muss)

    LINUX IS LIKE AN INDIAN TENT: NO GATES, NO WINDOWS AND AN APACHE INSIDE!
    Hardware Monitoring unter Linux -> http://santafu.sourceforge.net (Temperaturen, Lüfterdrehzahlen und Spannungen)

  4. #4
    Registrierter Benutzer
    Registriert seit
    14.02.2001
    Beiträge
    15
    Ich hab den Code ja nicht geschrieben. Und bevor ich das in eine Funktion reinpacke, versuche ich erst, den define hinzubekommen.

    Es gibt nämlich noch 5 oder 6 andere defines, die gleich aufgebaut sind - und ich möchte so wenig wie möglich dran rumtricksen.

    Ich werde mir mal das Beispielproggi ansehen.



    zum Fehler:
    Das Programm startet soweit. Mit printf hab ich mir debug-Messages ausgeben lassen. Eine vor der c2l() eine danach. Die davor wird ausgegeben, die danach nicht.
    Wobei kdevelop sagt, das alles in Ordnung war. (Exited normally)

  5. #5
    Registrierter Benutzer
    Registriert seit
    19.07.2004
    Beiträge
    50
    Kenn mich mit den Versionen nicht aus, aber bei gcc 3.3 gibts "-E", das macht nur Precompiling, davon solltest du dir mal den Quellcode anschauen, dann siehst du, was der dir aus deinen ganzen #defines (evil ) macht.

Lesezeichen

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •