在 InChi 库(可在此处获得: http: //www.iupac.org/home/publications/e-resources/inchi.html)有一个自定义的 SHA-2 算法实现(实现,不是算法)我是试图理解。特别是一小段代码确实令人困惑:
#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 char
PUT_UINT32_BE
total[0] % 256