2011-10-20 19 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); 
相关问题