2011-10-20 50 views
2

這是我想要做異或操作的兩個變量(用C語言)。如何在C中執行無符號長整數和字符數組的XOR操作?

unsigned long int z=0xB51A06CD; 

unsigned char array[] = {0xF0,0xCC,0xAA,0xF0}; 

desired output= 0X45D6AC3D 

我知道我不能做一個簡單的z^array,因爲它是一個字符數組,而不是單個字符。我需要一次執行一個字節的XOR還是C中有一個函數?

我正在嘗試各種瘋狂的事情來完成它,但始終無法挽回。如果任何人都可以用小代碼片段或至少一個粗略的想法幫助我,我會非常感激。

+1

沒有特殊功能,你必須做一次一個字符。除非你確定了序列號。 – Vlad

回答

3

array作爲指向此類表達式中第一個元素的指針處理爲長指針而不是char指針,並將其解引用。

unsigned long result = z^*(unsigned long *)array; 
+2

這很危險;你不知道字節數組是否適合'unsigned long'對齊。 –

+2

如果字節順序錯誤,則可能會失敗。 – Vlad

+0

可能是一個明顯的警告,但是在投射時要確保字節順序和字節順序正確。如果OP在控制陣列內容,它不應該是一個問題。如果它來自外部來源(COMM端口,套接字等),則所有投注都可能關閉。 –

1

只是要一個unsigned long int出你的陣列(警告,這取決於機器字節順序!):

unsigned long int z=0xB51A06CD; 
unsigned char array[] = {0xF0,0xCC,0xAA,0xF0}; 

unsigned long int w = 0; 
w |= array[0] << 0; 
w |= array[1] << 8; 
w |= array[2] << 16; 
w |= array[3] << 24; 

unsigned long output = z^w; 
+0

它不依賴於機器的排序,你剛纔做錯了。提問者的期望結果表明'array [1]'應該被移位16,而不是8,因爲'0x1A^0xCC == 0xD6'。 –

0
unsigned long int z=0xB51A06CD; 

unsigned char array[] = {0xF0,0xCC,0xAA,0xF0}; 
unsigned long tmp; 
memcpy(&tmp, array, sizeof tmp); 
... z^tmp ... 

注意,這仍然使得一些非便攜的假設:那unsigned long是4個字節,而且系統的字節順序是你期望的。

+0

無論是我的答案還是@ K-ballo的答案可能會更有用,具體取決於您想如何處理排序問題。這個問題的具體要求並不明確。 –

0

正如其他人所說,你必須擔心長期的排序和大小。以下是如何使其安全: 1)而不是unsigned long,使用uint32_t(來自inttypes.h),以確保你得到一個4字節的類型。 2)使用htonl()作爲一個獨立於平臺的方式,以確保您解釋陣列作爲大端值

z^htonl(*(uint32_t *)array); 
相關問題