在 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 );
问题是 total 被定义为 long
的表:
unsigned long total[2]; /*!< number of bytes processed */
所以现在,如果 total 保存处理的字节数,total[0]
很可能大于 256(这可能是它被定义为 long
的原因) >), 所以我不知道在 PUT_UINT32_BE
宏中将这个 long
转换为 unsigned char
会产生什么效果?那会得到第 x 个字节还是最后一个字节或 total[0] % 256
?
最佳答案
宏只是将 32 位值的单个 8 位实体从某个偏移量开始放入字节数组。这是通过移位操作完成的:第一个移位得到前 8 位(第 24 到 31 位),下一个移位得到第 16 到 23 位,然后是第 8 到 15 位,最后是第 0 到 7 位。
如果你做相反的事情,即从数组中获取字节并将它们放在一起作为 32 位值,你将得到原始值。
关于在 SHA-2 算法中将 long 转换为 unsigned char,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17272378/