2013-06-24 37 views
1

InChi库(可在此处获得:http://www.iupac.org/home/publications/e-resources/inchi.html)我试图理解SHA-2算法的自定义实现(实现,而不是算法)。在代码特定的一个短片段是真的混乱:在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投射到PUT_UINT32_BE宏中的效果是unsigned char吗?会得到第一个x字节或最后一个字节或total[0] % 256

+0

更仔细地阅读宏...它需要32位值的每个8位分量并重新排列它们。 –

+0

哦,我没有看到如何在你提供的上下文中调用宏? –

+0

@JoachimPileborg - 上下文现在已更正。在我的情况低= 904所以我怎么能投904无符号字符? – mnowotka

回答

1

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

如果你做相反的事情,即从数组中获取字节并将它们放在一起作为一个32位值,你将得到原始值。

0

为什么不使用简单的内存延迟?例如:

* (int*) &(b[(i)] = n; 
相关问题