C中三元运算符的逻辑?

时间:2013-07-10 00:32:25

标签: c algorithm encryption aes

我正在研究一些AES实现C代码。加密代码需要获取作为参数传递的密码,以及加密和输出文件。

我理解读取密码,并将其处理并将其转换为密钥。但是在这个循环中,我无法真正理解它在做什么。

int main(int argc, char **argv) {
 unsigned long rk[RKLENGTH(KEYBITS)];
 unsigned char key[KEYLENGTH(KEYBITS)];
 int i;
 int nrounds;
 char *password;
 FILE *output;
 if (argc < 3) {
  fputs("Missing argument\n", stderr);
  return 1;
 }                                              
 password = argv[1]
 for (i = 0; i < sizeof(key); i++)
  key[i] = *password != 0 ? *password++ : 0;  /* HERE IS WHERE I CAN'T GET IT */

关键字符串究竟发生了什么?我认为有一些逻辑内容和位操作。

3 个答案:

答案 0 :(得分:7)

您正在查看的循环是将sizeof(key)字节从password字符串复制到key缓冲区,如果长度为0,则填充缓冲区的其余部分password字符串的小于sizeof(key)

三元运算符的格式为:

  

条件 ? 表达式-1 : 表达式 - 2

如果条件为真,则评估 expression-1 ,否则评估 expression-2 。存在短路,因为只评估了其中一个表达式。所以,在你的代码中:

    key[i] = *password != 0 ? *password++ : 0; 

*password != 0变为false后,password不会再次递增。

答案 1 :(得分:6)

对于密钥中的每个字节,如果密码中有相应的字节(最初为argv[1]),则将该字节复制到密钥;否则将0(字节)复制到密钥。这是一种冗长的写作方式:

strncpy(key, password, sizeof(key));

(这也是我建议使用strncpy()的少数几次之一;一般情况下,它不会达到人们的期望,但在这里,它完全符合要求。)

答案 2 :(得分:1)

同样:

 key[i] = *password != 0 ? *password++ : 0;  /* HERE IS WHERE I CAN'T GET IT */

 =

 if (*password != 0) { key[i]=*password++; } else { key[i]=0; } ;