1

在 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 保存了处理的字节数,它很可能total[0]会大于 256(这可能是它被定义为的原因long),所以我不知道在宏中强制long转换它会有什么影响?那会得到第 x 个字节或最后一个字节还是?unsigned charPUT_UINT32_BEtotal[0] % 256

4

2 回答 2

1

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

如果您反其道而行之,即从数组中获取字节并将它们组合为一个 32 位值,您将获得原始值。

于 2013-06-24T09:50:28.650 回答
0

为什么不使用简单的内存取消引用?例如:

* (int*) &(b[(i)] = n;
于 2013-06-24T10:51:37.983 回答