在SHA-2算法中将long转换为unsigned char

时间:2013-06-24 09:40:14

标签: c algorithm casting sha256 sha2

在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

2 个答案:

答案 0 :(得分:1)

宏只是将一个32位值的8位实体放入一个字节数组,从某个偏移量开始。这是通过移位操作完成的:第一个移位得到前8位(位24到31),下一个移位得到16到23位,然后是8到15位,最后是0到7位。

如果您执行相反的操作,即从数组中获取字节并将它们作为32位值放在一起,您将获得原始值。

答案 1 :(得分:0)

为什么不使用简单的内存去除?例如:

* (int*) &(b[(i)] = n;