从字节转换为字

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

最佳答案

它所做的是将 1600 字节的数组视为小端 64 位值的数组,并将它们重新组织为五个 stateAsWords 数组作为 native 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

按位赋值只是从小端缓冲区逐字节构建 native 64 位字。

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

关于从字节转换为字,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20034411/

相关文章:

c - 替换字符串中的一个字符

PHP: str_word_count(åäöåäöåäöåäö) 返回整数值 12

c++ - 每 8 位将 bitset<64> 转换为字符串

java - 按位运算意外变为负数

c - C语言打印排序数组时出错?

c - Termcaps 下划线改变字符

swift - 如何为 Swift UI 添加字符的最大长度

linux - 取反数 : what is the fastest operation? 使用位运算还是使用 if 语句?

c - 调用哪个 ioctl 命令

MySQL检查一个单词在表格单元格中出现了多少次