1

InChi ライブラリ (ここで入手可能: http://www.iupac.org/home/publications/e-resources/inchi.html ) には、SHA-2 アルゴリズムのカスタム実装があります (実装であり、アルゴリズムではありません)。理解しようとしています。特に、コードの 1 つの短い断片が非常に紛らわしいです。

#define PUT_UINT32_BE(n,b,i)                            \
{                                                       \
    (b)[(i)    ] = (unsigned char) ( (n) >> 24 );       \
    (b)[(i) + 1] = (unsigned char) ( (n) >> 16 );       \
    (b)[(i) + 2] = (unsigned char) ( (n) >>  8 );       \
    (b)[(i) + 3] = (unsigned char) ( (n)       );       \
}
#endif

このマクロは、次のコンテキストで使用されます。

unsigned char msglen[8];
low  = ( ctx->total[0] <<  3 );
PUT_UINT32_BE( low,  msglen, 4 );

問題は、合計が次の表として定義されていることですlong

unsigned long total[2];     /*!< number of bytes processed  */

したがって、 total が処理されたバイト数を保存する場合total[0]、256 を超える可能性が非常に高いため (これがおそらく として定義されている理由です) 、マクロでlongこれlongをキャストするとどうなるかわかりませんか? それは最初の x バイトまたは最後のバイトまたは?unsigned charPUT_UINT32_BEtotal[0] % 256

4

2 に答える 2

0

単純なメモリ参照解除を使用しないのはなぜですか? 例えば:

* (int*) &(b[(i)] = n;
于 2013-06-24T10:51:37.983 に答える