0

このメソッドの機能を理解しようとかなりの時間を費やした後、私はまだそれが何をするのか理解できませんでした. 私が理解しているように、stateAsBytes には "\xA1\X32\X89\XB2" のような 16 進文字列が含まれている必要がstateAsWords[i%5][i/5] |= (unsigned long )(stateAsBytes[i*(64/8)+j]) << (8*j)あります。なぜビットごとの代入を使用するのですか?

void fromBytesToWords(unsigned long  **stateAsWords, unsigned char *stateAsBytes)
{
  for(int i=0; i<(1600/64); i++) {
    stateAsWords[i%5][i/5] = 0;
    for(int j=0; j<(64/8); j++)
      stateAsWords[i%5][i/5] |= (unsigned long )(stateAsBytes[i*(64/8)+j]) << (8*j);
  }
} 
4

1 に答える 1

0

1600 バイトの配列をリトル エンディアンの 64 ビット値の配列として扱い、それらをstateAsWordsネイティブの 64 ビット ワードとして 5 つの配列に再編成します。

                 "index" of the 64 bit value 
                    from the stateAsBytes 
                         buffer

    stateAsWord[0]: 0, 5, 10, 15, 20
    stateAsWord[1]: 1, 6, 11, 16, 21
    stateAsWord[2]: 2, 7, 12, 17, 22
    stateAsWord[3]: 3, 8, 13, 18, 23
    stateAsWord[4]: 4, 9, 14, 19, 24

ビット単位の割り当ては、リトルエンディアン バッファーからバイト単位でネイティブ 64 ビット ワードを構築するだけです。

投稿したコードunsigned longは 64 ビット型であると想定しているため、移植性の問題があることに注意してください。特に、ほとんどの 32 ビット ターゲットでは動作せず、Windows (64 ビット Windows でも) でも動作しません。

于 2013-11-17T20:47:46.117 に答える