2009-04-17 18 views
-1

私はこの構文にいくつか問題があります。このC関数が何をしているのか、誰かに説明してもらえますか?誰かがこのC関数について説明できますか?

unsigned long protodec_henten(int from, int size, unsigned char *frame) 
{ 
    int i = 0; 
    unsigned long tmp = 0; 

    for (i = 0; i < size; i++) 
    tmp |= (frame[from + i]) << (size - 1 - i); 

    return tmp; 
} 

ありがとうございます!

+0

Cの構文やprotodec_henten()の目的についてこの質問はありますか? – Tom

+0

"Explain code" - 質問は一般に "愚か"なので、関数が何であるか、ビットが何であるか、関数の結果について知りたいかどうかは分かりません。 –

+5

例の呼び出しがなければ、関数の目的を判断するのは難しいです。それは、どのフレームが含まれているかに応じて、さまざまな目的(いくつかの難解なもの、かなり単純なもの)の塊を提供することができます。 – Pesto

答えて

15

私は混乱している構文の次の行を参照していると思います。

tmp |= (frame[from + i]) << (size - 1 - i); 

  • [I +から]フレームこれを打破することができます:配列への初期インデックスを表し、iは、単に現在のオフセットである「からの」。したがって、これはインデックス "from"から始まる配列を効果的に反復しています。
  • size - 1 - i:これは現在のインデックスに基づいて移動するビット数を計算しています。この数値は、サイズ-1で始まり、ループが進むにつれて減少します。
  • (フレーム[from + i] < <(size - 1 - i):これは、指定したビット数で+ iから値をシフトします)
  • TPM | = ...:ドス反復値がシフトされた後、まだ利用可能なバイトのビット単位のOR式
+2

+1おそらく彼が望んだことを詳細に説明したのはあなただけです – TStamper

+2

バイトではなく指定されたビット数だけシフトしていませんか? –

+0

@Jeff、はいビットはバイトではありません(タイプミスを修正しました) – JaredPar

0

ハッシュ関数のように見えます。 2番目の考えでは、これはかなり劣悪なハッシュ関数になります。

これらは、すべてのフレームを残りのサイズだけシフトし、静的な値でOR演算します。この値が返されます。

+0

最終的に値が1111 1111になるので、それは駄目なハッシュ関数であることに気がつきました。 –

+0

ええと、xor(^)は、ハッシュ関数ではなく、(|)で求めたいものです。 –

0

tmp |=を理解していないと思いますが、おそらくこれはコード内の「難しい」部分です。 C演算子を検索しようとすると、リストhereが見つかるでしょう。|=は "Bitwise or"を意味します。それらについてはhereを読むことができます。

だから、何らかの入力が必要な場合は、functonに "buffer"/"frame"の読み込みを開始する場所を指定し、 "size"パラメータと同じくらいビット数または位置を指定します。

+1

|ビットごとのOR、|はビット単位のOR代入演算子です。 – Samuel

+0

はい、よく=私はそれを説明する必要がありますか? –

7

その他は、すでにそれぞれの行を説明したので、私はちょうど何の機能を追加しますです。位置が異なる "スタック"上の位置(from)と(from+size)の間のframeのバイトを想像することができます。 stバイトが左に配置されます。 「下」バイトのいずれかが関連する位置に設定されたビットを有する場合

bits from:  tmp: | + +  |(LSB-side of tmp) 
frame[from]:   ---+---- 
frame[from+1]:   -----+-- 
frame[from+2]:   -+------ 
... 

今tmpが設定されたビットを有します。

0

により、ビット単位には、OR、この機能は理にかなってframeのすべての値が0またはこの場合

1.、それはへのインデックスfromから始まるframesize連続した値(すなわちビット)を置く場合にのみ、単一のunsigned long。最後のビット(インデックスfrom+size-1)が最下位ビットとして挿入されます。

-3

この全体的なコードは、データの範囲をtmp変数にコピーするだけです。実際、単にmemcpyを難しい方法でやっているだけです。

理由だけでない:memcpyを(& TMP、サイズ、からフレーム+)が

+0

Nevermind。それはバイトではなくビットをシフトしています。 –

2

は、ビットパッカーのように見えます。 Ericが提案したように、frameのすべての文字が0または1の場合、size文字になり、その値はtmpにパックされます。たとえば、frame(オフセットstart)に値00 01 00 00 01 01 01 00が含まれている場合、protodec_henten(0,8,frame)は(先行ゼロは省略されます)0x4E(または2進数では01001110)を返します。これを行うより良い方法があるので、何か他のことをしているかもしれませんが、何を言うのは難しいです。

関連する問題