2017-01-24 13 views
3

彼らは完全に冗長に見えるように私はただ、彼らはpkt << uint32(0)を使用する理由を把握しようとしている私は現在、オープンソースのサーバーのためのGoogleの認証を実装しようとしていると、彼らはコード左シフトのポイントは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); 
       } 

のこの小さなビットを持っています私に。そして、彼らはまたそれを何度も使っています。それはずっと意味がありません。

なぜコードがそのように書かれたのですか?

+0

私はあなたの質問を正しく理解していないと思いますが、私の編集をロールバックしてください。 – Rakete1111

+0

呼び出しは、コンパイラがオーバーロードされたバージョンの「<<」演算子を使用する必要があるかどうかをコンパイラに知らせるのを助けています。リテラル '0'は、intやunsigned intを含む多くの型に暗黙的に変換できます。明示的な変換を使用する場合は、コンパイラーにリードし、一致するシグニチャーでオーバーロードを呼び出すことができます。これは、コンパイラが何をすべきか分からず、あいまいな関数呼び出しコンパイルエラーで終了する場合に役立ちます。 – ccpgh

+0

詳細については、http://stackoverflow.com/questions/6233132/c-compiler-error-ambiguous-call-to-overloaded-functionを参照してください。 – ccpgh

答えて

10

オペレータ< <でのByteBuffer(これはPKT型である)のためにオーバーロードされ、そして以下のように見える:

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

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

ので、そのない0のシフトが、値0を付加

+0

それでは、パケットの最後に0を加え続けますか?したがって、追加する値を知るためには、クライアント側のパケットがそれらの場所にあることを期待しているかどうかを知る必要がありますか? – Datsik

+0

@Datsikはい.... – marcinj

+0

@Datsikはい、追加する値を知るためには、プロトコルを知る必要があります。 – gurka

1

pktは、オーバーロードするクラスタイプの可能性がありますoperator<<;そうでない場合は、結果が使用されないため、これらの文はすべて無効になります。 (pkt <<= 0ではなくpkt << 0)。

+0

演算子は、その時点で設定された値のみであると言っていますか? – Datsik

+0

@Datsik:申し訳ありませんが、あなたは何を意味するのか分かりません。 – edmz

関連する問題