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

标签 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 );

问题是 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/

相关文章:

algorithm - 球面上的射线-多边形交点

c - 运算符优先级和自动提升(避免溢出)

postgresql - 在 PostgreSQL 中::做什么?

c - 如何引用名称字母顺序对 C 中的结构进行冒泡排序

c - Unix 系统调用名称后面的 (2) 是什么意思?

c - 如何正确使用多维数组中的指针?

algorithm - 如何求解递归复杂度T(n) = T(n/3)+T(2n/3)+cn

algorithm - 使用堆栈的摊余成本分析

c - 是否有任何快速算法来计算所有 2 的幂的数字的 log2?

python - 将包含逗号分隔值的字符串转换为整数