在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[0]
很可能大于256(这可能是它定义为long
的原因),所以我不知道在long
宏中将此unsigned char
转换为PUT_UINT32_BE
会产生什么影响?这会得到拳头x个字节或最后一个字节还是total[0] % 256
?
答案 0 :(得分:1)
宏只是将一个32位值的8位实体放入一个字节数组,从某个偏移量开始。这是通过移位操作完成的:第一个移位得到前8位(位24到31),下一个移位得到16到23位,然后是8到15位,最后是0到7位。
如果您执行相反的操作,即从数组中获取字节并将它们作为32位值放在一起,您将获得原始值。
答案 1 :(得分:0)
为什么不使用简单的内存去除?例如:
* (int*) &(b[(i)] = n;