2013-07-10 205 views
2

我正在學習一些AES實現的C代碼。加密代碼需要獲取作爲參數傳遞的密碼,以及加密和輸出文件。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 */ 

關鍵字串究竟發生了什麼?我認爲有一些邏輯性的東西和位操作。

+1

你需要學習的指針。 – SLaks

+1

看起來這個問題也可能是關於使用三元運算符(?)的問題。這只是編寫if-else語句的一種較短的方式。 – Egg

+2

這可能會有點偏離主題,但只要將密碼字節插入到密鑰中,正確的[密鑰派生函數](http://en.wikipedia.org/wiki/Key_derivation_function)就是一個改進。 –

回答

7

你正在尋找被複制從passwordsizeof(key)字節到key緩衝器,並與0填充所述緩衝器的其餘部分,如果password字符串的長度小於sizeof(key)環路。

三元運算符具有以下形式:

條件?表達-1:表達-2

如果條件爲真,則表達式-1被評估,否則表達式-2被評估。有短路,因爲只有一個表達式被評估過。所以,在你的代碼:

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

一旦*password != 0爲假,password不會再次增加。

6

對於密鑰中的每個字節,如果密碼中有相應的字節(最初爲argv[1]),則將該字節複製到密鑰;否則複製一個0(字節)到鍵。這是寫作的長篇大論方式:

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

(這也是我永遠建議使用strncpy()的幾次之一;在一般情況下,它不會做什麼的人期待,但在這裏,它確實究竟需要什麼)

+0

它與'strncpy'不完全相同;如果'password'小於'sizeof(key) - 1',則三元運算符循環也會填充'key'的其餘部分。 –

+1

@JeffreyHantin:'strncpy()'也是這樣,這就是爲什麼我爲喬納森的答案+1。 – jxh

+2

@jxh:好吧,我會好的,我以爲它停在第一個空。我想這只是證明了'一般'不符合人們的期望。 :) –

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; } ;