Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/72.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C SHA-2算法中长字符到无符号字符的转换_C_Algorithm_Casting_Sha256_Sha2 - Fatal编程技术网

C 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 ); \

在InChi库(可在此处找到:)中,有一个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保存处理的字节数,那么
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?