如何在C语言中对无符号长整数和字符数组执行异或运算?

如何在C语言中对无符号长整数和字符数组执行异或运算?,c,C,这是我的两个变量,我想用它们执行异或操作(在C中) 我知道我不能做一个简单的z^array,因为它是一个字符数组而不是单个字符。我必须一次执行一个字节的异或运算,还是在C语言中有一个函数 我正在尝试各种疯狂的事情来完成它,但总是失败得很惨。如果有人能为我提供一个小代码片段或至少是一个粗略的想法,我将不胜感激。将数组转换为一个长指针,而不是char指针,并取消对它的引用 unsigned long result = z ^ *(unsigned long *)array; 只需从数组中生成一个无

这是我的两个变量,我想用它们执行异或操作(在C中)

我知道我不能做一个简单的
z^array
,因为它是一个字符数组而不是单个字符。我必须一次执行一个字节的异或运算,还是在C语言中有一个函数


我正在尝试各种疯狂的事情来完成它,但总是失败得很惨。如果有人能为我提供一个小代码片段或至少是一个粗略的想法,我将不胜感激。

数组
转换为一个长指针,而不是char指针,并取消对它的引用

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

只需从数组中生成一个
无符号长int
(警告,这取决于机器端数!):

unsigned long int z=0xB51A06CD;
无符号字符数组[]={0xF0,0xCC,0xAA,0xF0};
无符号长整型w=0;
w |=数组[0]

请注意,这仍然会产生一些不可移植的假设:
unsigned long
是4字节,系统的endianness是您所期望的。

正如其他人提到的,您必须担心endianness和long的大小。以下是如何使其安全: 1) 使用uint32_t(来自inttypes.h)而不是unsigned long,以确保获得4字节的类型。 2) 使用htonl()作为独立于平台的方法,以确保将数组解释为大端值

z ^ htonl(*(uint32_t *)array);

没有特殊的功能,你必须一次完成一个字符。除非你对终点有把握,那是危险的;您不知道字节数组是否针对
unsigned long
正确对齐。这可能是一个明显的警告,但在强制转换时,请确保字节顺序和Endianness正确。如果OP控制着数组内容,那么它不应该是一个问题。如果它来自外部源(COMM port、socket等),则所有下注都可能是无效的。加上字符是C#中的unicode,因此您的xor值实际上将是0x00F000AA00CC00F0 my Response或@K-ballo的Response可能更有用,这取决于您希望如何处理endianness问题。具体要求从问题上看不清楚。这不取决于机器的末端,你只是用了错误的方法。提问者期望的结果表明
array[1]
应该移位16,而不是8,因为
0x1A^0xCC==0xD6
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;
unsigned long int z=0xB51A06CD;

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