2017-01-24 1 views
3

Ich versuche derzeit über eine Google Authenticator für Open-Source-Server, und sie haben dieses kleine Stück CodeWas ist der Punkt der linken Verschiebung um 0?

if (securityFlags & 0x01)    // PIN input 
       { 
        pkt << uint32(0); 
        pkt << uint64(0) << uint64(0);  // 16 bytes hash? 
        // This triggers the 2 factor authenticator entry to popup on the client side 

       } 

       if (securityFlags & 0x02)    // Matrix input 
       { 
        pkt << uint8(0); 
        pkt << uint8(0); 
        pkt << uint8(0); 
        pkt << uint8(0); 
        pkt << uint64(0); 
       } 

       if (securityFlags & 0x04)    // Security token input 
       { 
        pkt << uint8(1); 
       } 

Ich versuche, warum sie pkt << uint32(0) verwenden, um herauszufinden, einfach zu implementieren, da sie völlig überflüssig erscheinen mir. Und sie benutzen es auch oft, was noch weniger Sinn macht.

Irgendwelche Ideen, warum ihr Code so geschrieben wurde?

+0

Ich hoffe, ich habe deine Frage richtig verstanden, wenn nicht, rolle bitte meine Bearbeitung zurück. – Rakete1111

+0

Die Aufrufe helfen dem Compiler, zu wissen, welche der überladenen Versionen des Operators '<<' verwendet werden sollte. Das Literal '0' könnte implizit in eine Anzahl von Typen konvertiert werden, einschließlich int und unsigned int. Wenn Sie eine explizite Konvertierung verwenden, können Sie den Compiler veranlassen, Ihrem Lead zu folgen und die Überladung mit der passenden Signatur aufzurufen. Dies hilft in der Situation, in der der Compiler nicht weiß, was zu tun ist, und mit einem mehrdeutigen Funktionsaufrufkompilierungsfehler beendet wird. – ccpgh

+0

Weitere Informationen finden Sie unter http://stackoverflow.com/questions/6233132/c-compiler-error-ambigous-call-to-overloaded-function. – ccpgh

Antwort

10

Betreiber < < für ByteBuffer überlastet (dies ist ein pkt-Typ), und es sieht aus wie folgt:

https://github.com/mangostwo/server/blob/b8ce9508483375a36699c309bce36810c4548007/src/shared/ByteBuffer.h#L138

ByteBuffer& operator<<(uint8 value) 
    { 
     append<uint8>(value); 
     return *this; 
    } 

so dass ihr nicht eine Verschiebung um 0, aber der Wert anhängt 0

+0

Also wird nur 0 am Ende des Pakets hinzugefügt? Um zu wissen, welche Werte angehängt werden sollen, müssen Sie wissen, was das clientseitige Paket an diesen Stellen erwartet. – Datsik

+0

@Datsik ja .... – marcinj

+0

@Datsik Ja, um zu wissen, welche Werte Sie anhängen müssen, müssten Sie das Protokoll kennen. – gurka

1

pkt ist wahrscheinlich von einem Klassen-Typ, der operator<< überlastet; Wenn dies nicht der Fall wäre, hätten all diese Anweisungen keine Auswirkung, da das Ergebnis nicht verwendet wird. (pkt << 0 statt pkt <<= 0).

+0

Sagen Sie, der Operator sei nur der Wert, der zu der Zeit durch << gesetzt wurde? – Datsik

+0

@Datsik: Entschuldigung, ich verstehe nicht, was du meinst. – edmz

Verwandte Themen