C SHA-2算法中长字符到无符号字符的转换
在InChi库(可在此处找到:)中,有一个SHA-2算法的自定义实现(实现,而不是算法),我正试图理解它。特别是一小段代码确实令人困惑:C SHA-2算法中长字符到无符号字符的转换,c,algorithm,casting,sha256,sha2,C,Algorithm,Casting,Sha256,Sha2,在InChi库(可在此处找到:)中,有一个SHA-2算法的自定义实现(实现,而不是算法),我正试图理解它。特别是一小段代码确实令人困惑: #define PUT_UINT32_BE(n,b,i) \ { \ (b)[(i) ] = (unsigned char) ( (n) >> 24 ); \
#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保存处理的字节数,那么
total[0]
很可能会大于256(这可能是它被定义为long
)的原因),所以我不知道在PUT\u UINT32\u be
宏中将这个long
转换为无符号字符会有什么效果?这是第一个x字节还是最后一个字节,还是总共[0]%256?宏只是从某个偏移量开始,将32位值的单个8位实体放入字节数组中。这是通过移位操作完成的:第一次移位得到前8位(位24到31),下一次移位得到位16到23,然后是位8到15,最后是位0到7
如果执行相反的操作,即从数组中获取字节并将它们作为32位值放在一起,您将获得原始值。宏只是从某个偏移量开始,将32位值的单个8位实体放入字节数组中。这是通过移位操作完成的:第一次移位得到前8位(位24到31),下一次移位得到位16到23,然后是位8到15,最后是位0到7
如果执行相反的操作,即从数组中获取字节,并将它们作为32位值放在一起,则可以恢复原始值。为什么不使用简单的内存去中心化?例如:
* (int*) &(b[(i)] = n;
为什么不使用简单的内存去中心化?例如:
* (int*) &(b[(i)] = n;
请更仔细地阅读宏。。。它接受32位值的每个8位分量并重新排列。哦,我看不出在您提供的上下文中宏是如何调用的?@JoachimPileborg-context现在被更正了。在我的例子中,low=904,那么如何将904转换为unsigned char呢?请仔细阅读宏。。。它接受32位值的每个8位分量并重新排列。哦,我看不出在您提供的上下文中宏是如何调用的?@JoachimPileborg-context现在被更正了。在我的例子中,low=904,那么如何将904转换为unsigned char?