从字节转换为字

时间:2013-11-17 18:19:07

标签: c word bit-manipulation keccak

花了很长时间试图理解这个方法的功能后,我仍然无法弄清楚它是做什么的。据我所知,stateAsBytes应该包含十六进制字符串,如“\ xA1 \ X32 \ X89 \ XB2”,stateAsWords[i%5][i/5] |= (unsigned long )(stateAsBytes[i*(64/8)+j]) << (8*j)做什么?为什么它使用按位赋值?

void fromBytesToWords(unsigned long  **stateAsWords, unsigned char *stateAsBytes)
{
  for(int i=0; i<(1600/64); i++) {
    stateAsWords[i%5][i/5] = 0;
    for(int j=0; j<(64/8); j++)
      stateAsWords[i%5][i/5] |= (unsigned long )(stateAsBytes[i*(64/8)+j]) << (8*j);
  }
} 

1 个答案:

答案 0 :(得分:0)

它正在做的是将1600字节的数组视为小端64位值的数组,并将它们重新组织为五个stateAsWords数组作为本机64位字:

                 "index" of the 64 bit value 
                    from the stateAsBytes 
                         buffer

    stateAsWord[0]: 0, 5, 10, 15, 20
    stateAsWord[1]: 1, 6, 11, 16, 21
    stateAsWord[2]: 2, 7, 12, 17, 22
    stateAsWord[3]: 3, 8, 13, 18, 23
    stateAsWord[4]: 4, 9, 14, 19, 24

按位赋值只是从little-endian缓冲区逐字节构建一个本机64位字。

请注意,您发布的代码假定unsigned long是64位类型,因此它存在一些可移植性问题 - 特别是它不适用于大多数32位目标,并且它不适用于Windows (甚至是64位窗口)。