我正在第一次使用結構指針,我似乎無法理解這裏發生了什麼。我的測試應用了xor的基本屬性,它表示x^y^y = x,但不包含在C中?我無法理解結構指針的這種行爲和XOR
下面的代碼在我的主程序中,準確地恢復所有「測試」的字母(我繼續在屏幕上打印,但我省略了很多垃圾,以便將此問題縮短ER))。該結構「AES」是指這樣的定義:
typedef uint32_t word;
struct aes {
word iv[4];
word key[8];
word state[4];
word schedule[56];
};
根據上下文可能暗示,封裝項目是AES實現(我想通過嘗試新的技術,以加快我目前的一個)。
在我的測試,make_string和make_state可靠地工作,即使在功能有問題,但對於引用的緣故:
void make_string (word in[], char out[]) {
for (int i = 0; i < 4; i++) {
out[(i * 4) + 0] = (char) (in[i] >> 24);
out[(i * 4) + 1] = (char) (in[i] >> 16);
out[(i * 4) + 2] = (char) (in[i] >> 8);
out[(i * 4) + 3] = (char) (in[i] );
}
}
void make_state(word out[], char in[]) {
for (int i = 0; i < 4; i++) {
out[i] = (word) (in[(i * 4) + 0] << 24)^
(word) (in[(i * 4) + 1] << 16)^
(word) (in[(i * 4) + 2] << 8)^
(word) (in[(i * 4) + 3] );
}
}
不管怎麼說,這是不工作的模塊。正是這種功能,我試圖通過收納它拿走的功能模塊化:
char test[16] = {
'a', 'b', 'c', 'd',
'e', 'f', 'g', 'h',
'i', 'j', 'k', 'l',
'm', 'n', 'o', 'p'
};
aes cipher;
struct aes * work;
work = &cipher;
make_state(work->state, test);
work->state[0] ^= 0xbc6378cd;
work->state[0] ^= 0xbc6378cd;
make_string(work->state, test);
儘管此代碼的工作,通過它傳遞給函數做同樣的事情不會:
void encipher_block (struct aes * work, char in[]) {
make_state(work->state, in);
work->state[0] ^= 0xff00cd00;
make_string(work->state, in);
}
void decipher_block (struct aes * work, char in[]) {
make_state(work->state, in);
work->state[0] ^= 0xff00cd00;
make_string(work->state, in);
}
但是,通過在加密和解密中刪除make_state和make_string調用,它可以按預期工作!
make_state(work->state, test);
encipher_block(&cipher, test);
decipher_block(&cipher, test);
make_string(work->state, test);
所以澄清,我沒有問題!我只是想了解這種行爲。
對於按位運算,我認爲這並不重要。 –
我在答案中添加了文字,解釋'char'如何破壞你的代碼。 –
啊,謝謝。我從來不會猜到它是這樣做的。 –