2016-07-03 8 views
0

私は購入したテキストブックで自分自身を教えています。一般的にはこれはかなり簡単ですが、私が把握していないエリアはビット操作に簡単に関係します。私は、文字通り(隔離された)意味での演算子の利用を理解していますが、以下の特定の文脈でそれがどのように適用されるかはわかりません。c - decryptionにおけるビット操作/操作

ここでは、いくつかの解読アルゴリズムのコンテキストでどのように/何をしているのか把握できなかった2つの例があります。

私が探しているのはすべて、16進数とビットシフト/左右が一緒にやっていることを説明するビットです。

オンラインで見ているほとんどの例は、孤立した意味であり、これまでのところ、このシナリオでどのように適用されているのかは分かりません。

誰かが推薦できるビット操作/操作に特有の教科書があれば、私はそのような情報に投資したいと思うでしょう。これは本当にこれを釘付けにする私の決意です(私は何かを完全に把握せずに動くのが嫌いです)。

  unsigned long lBits = 0; 
      lBits = ((unsigned long)(key[28] & 0xFFFF)<< 24)| 
      ((unsigned long)(key[29] & 0xFFFF)<< 16)| 
      ((unsigned long)(key[30] & 0xFFFF)<< 8)| 
      ((unsigned long)(key[31] & 0xFFFF)); 

    ... 

    for(i=0; i < max_length ; i++){ 
    unsigned long tBits = lBits | i;  
    tkey[28] = (unsigned char) (tBits >> 24); 
    tkey[29] = (unsigned char) (tBits >> 16); 
    tkey[30] = (unsigned char) (tBits >> 8); 
    tkey[31] = (unsigned char) (tBits); 
+0

あなたは 'key'と' tkey'の宣言を提供していません。 – owacoder

+0

ええ、私は例がかなり長いので、私が掲示していたコードの量を減らすことを考えていました。 keyは、32ビットのキーの一部であるコマンドラインから渡されるchar配列argです.tkeyは、32ビットの長さを満たすために0で埋め込まれた同じキーです。 – xxdefaultxx

+0

'unsigned char'配列か' char'だけですか? – owacoder

答えて

1

ライン・バイ・ラインこれを打破するのをしてみましょう:

 unsigned long lBits = 0; 
     lBits = ((unsigned long)(key[28] & 0xFFFF)<< 24)| 
     ((unsigned long)(key[29] & 0xFFFF)<< 16)| 
     ((unsigned long)(key[30] & 0xFFFF)<< 8)| 
     ((unsigned long)(key[31] & 0xFFFF)); 

はこれが最初で、かなり混乱しています。一見すると、これはkey[28]から始まるビッグエンディアンの32ビット整数を読み取ろうとしているようです。しかし、マスクは0xFFFF(16ビット)であるため、通常の8ビットマスクの0xFFではなく、実際の効果ではありません。実際に起こっているのは、keyのバイトが実際に32ビットの長さにORされているということです。文脈の欠如を考えると、これが達成すべきものを正確に言うのは厳密です。私は、それが鍵のビットを一緒に混合して「丸い鍵」などを形成していると考えます。

for(i=0; i < max_length ; i++){ 
    unsigned long tBits = lBits | i;  
    tkey[28] = (unsigned char) (tBits >> 24); 
    tkey[29] = (unsigned char) (tBits >> 16); 
    tkey[30] = (unsigned char) (tBits >> 8); 
    tkey[31] = (unsigned char) (tBits); 

これは少し明確です。ビッグエンディアン形式でtBits | itkey[28]と書くだけです。

実際には、これはiのビットのすべての組み合わせに対してループしており、key[28]から始まる32ビットに書き込んでいます。私はループ本体の残りの部分がこれらのビットで何かをすると推測します。

+0

あなたの入力をありがとう。カウンターは、提供された部分キーを満たすために可能な組み合わせの数を繰り返します。私は本当にそれがどのように上記に当てはまるか理解していない。 – xxdefaultxx

+0

ごめんなさい。ちょうど実現カウンターは私でなければなりません。私は間違ってコピーしました。 :( – xxdefaultxx