1

libb64 プロジェクトから取得した次のコードを見てきました。switch ブロック内の while ループの目的を理解しようとしています -

switch (state_in->step)
    {
        while (1)
        {
    case step_a:
            do {
                if (codechar == code_in+length_in)
                {
                    state_in->step = step_a;
                    state_in->plainchar = *plainchar;
                    return plainchar - plaintext_out;
                }
                fragment = (char)base64_decode_value(*codechar++);
            } while (fragment < 0);
            *plainchar    = (fragment & 0x03f) << 2;
    case step_b:
            do {
                if (codechar == code_in+length_in)
                {
                    state_in->step = step_b;
                    state_in->plainchar = *plainchar;
                    return plainchar - plaintext_out;
                }
                fragment = (char)base64_decode_value(*codechar++);
            } while (fragment < 0);
            *plainchar++ |= (fragment & 0x030) >> 4;
            *plainchar    = (fragment & 0x00f) << 4;
    case step_c:
            do {
                if (codechar == code_in+length_in)
                {
                    state_in->step = step_c;
                    state_in->plainchar = *plainchar;
                    return plainchar - plaintext_out;
                }
                fragment = (char)base64_decode_value(*codechar++);
            } while (fragment < 0);
            *plainchar++ |= (fragment & 0x03c) >> 2;
            *plainchar    = (fragment & 0x003) << 6;
    case step_d:
            do {
                if (codechar == code_in+length_in)
                {
                    state_in->step = step_d;
                    state_in->plainchar = *plainchar;
                    return plainchar - plaintext_out;
                }
                fragment = (char)base64_decode_value(*codechar++);
            } while (fragment < 0);
            *plainchar++   |= (fragment & 0x03f);
        }
    }

その間、何を与えることができますか?とにかく、スイッチは常にいずれかのケースのみを実行するようです。私は何か見落としてますか?

ありがとう。

4

3 に答える 3

3

ケニーが言うように、このコードはダフの装置のようです。 ウィキペディアがそれについて述べていることは次のとおりです

于 2010-06-16T08:57:44.030 に答える
3

これは Duff のデバイスですが、このバージョンはループ展開の最適化を実装するためのものではなく、Base64 でエンコードされたストリームに反復子を実装するためのものです。したがって、次のようなことができます。

Base64Stream stream; // the base64 data

char c;

while ((c == stream->NextChar ()) != 0)
{
  // do something with c
}

指定されたコードでは、最初のスイッチを使用して前のreturn終了場所にジャンプし、while (1) を使用して反復ループを無期限に続行します。ただし、この関数ではバッファ オーバーランに対する保護はありません。

C# では、これに対するより適切な解決策であるyieldステートメントがあります。

于 2010-06-16T09:22:39.670 に答える
0

それがダフのデバイスを実装する試みである場合、それはおそらく見当違いです。

ウィキペディアで説明されているように、Duffのデバイスの場合、ループは有限ですが、上記のコードでは、終わりのないループであることに注意してください。それが終了する唯一の可能性は、(codechar == code_in + length_in)条件が満たされることです(ただし、code_idとlength_inはコードスニペットでは不変です)。

Duffのデバイスとしても機能するかどうか、つまりコンパイラによる適切なループ拡張が行われるかどうかは疑問です。

于 2010-06-16T09:12:25.110 に答える