为什么要打印;0“&引用;1“;作为字符,有时作为ASCII 48/49?
我是C语言的初学者。我在编写代码时注意到了这一点 要对字符数组中的元素进行异或运算,为什么有些显示0/1,有些显示ASCII?我如何让它们都像数字0或1那样工作 在函数XOR中,我想对两个数组中的元素进行XOR,并将结果存储在另一个数组中 大体上,我做了一些实验 顺便说一下,除了打印结果,我还想做01二进制运算。例如加密和解密 这是一段C代码为什么要打印;0“&引用;1“;作为字符,有时作为ASCII 48/49?,c,C,我是C语言的初学者。我在编写代码时注意到了这一点 要对字符数组中的元素进行异或运算,为什么有些显示0/1,有些显示ASCII?我如何让它们都像数字0或1那样工作 在函数XOR中,我想对两个数组中的元素进行XOR,并将结果存储在另一个数组中 大体上,我做了一些实验 顺便说一下,除了打印结果,我还想做01二进制运算。例如加密和解密 这是一段C代码 #include <stdio.h> #include <stdlib.h> #include <string.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int XOR(char *u, char *w, char *v)
{
for(int i = 0; i < 16; i++)
{
u[i] = w[i] ^ v[i];
}
return 0;
}
int PrintList(char *list, int n)
{
for(int i = 0; i < n; i++)
{
printf("%d", list[i]);
}
return 0;
}
int main()
{
char u[17] = "";
char w[17] = "0001001000110100";
char v[17] = "0100001100100001";
XOR(u, w, v);
PrintList(u, 16);
printf("\n");
char w2[17] = "1000110011101111";
XOR(u, w2, v);
PrintList(u, 16);
printf("\n");
char v2[17] = "1111111011001000";
XOR(u, w2, v2);
PrintList(u, 16);
printf("\n");
char x[17] = "0101101001011010";
XOR(u, x, u);
PrintList(u, 16);
printf("\n");
memcpy(w, u, 16);
XOR(u, w, v);
PrintList(u, 16);
printf("\n");
return 0;
}
那么,将我的声明从char
更改为unsigned char
,可能是由于printf(“%d”,list[i])代码>打印结果没有变化。更改为printf(“%c”,列表[i])代码>打印结果:
0010100001111101
Process returned 0 (0x0) execution time : 0.041 s
Press any key to continue.
这些是字符串,因此您最初有ASCII码48(0011 0000)和49(0011 0001)。^
运算符是按位异或的,因此值为48和49的两个操作数的结果可以是0或1。当您将结果打印为整数时,您将得到预期的0或1
但是,如果以后使用该操作的结果,则不再有ASCII码数组,而是值为0或1的整数数组。如果使用仍然是ASCII码数组的数组对该数组进行异或,例如00110000^0
,则将得到结果00110000
,而不是0
。printf会给你48个等。这些是字符串,所以你最初有ASCII码48(0011 0000)和49(0011 0001)。^
运算符是按位异或的,因此值为48和49的两个操作数的结果可以是0或1。当您将结果打印为整数时,您将得到预期的0或1
但是,如果以后使用该操作的结果,则不再有ASCII码数组,而是值为0或1的整数数组。如果使用仍然是ASCII码数组的数组对该数组进行异或,例如00110000^0
,则将得到结果00110000
,而不是0
。所以printf会给你48个字符,等等。字符“0”是00110000 二进制的。”1’是00110001
'0' ^ '0' = 00000000 (0)
'0' ^ '1' = 00000001 (1)
'1' ^ '1' = 00000000 (0)
但随后您将重用u
数组
'0' ^ 0 = 0011000 (48)
'0' ^ 1 = 0011001 (49)
'1' ^ 0 = 0011001 (49)
'1' ^ 1 = 0011000 (48)
字符“0”为空00110000 二进制的。”1’是00110001
'0' ^ '0' = 00000000 (0)
'0' ^ '1' = 00000001 (1)
'1' ^ '1' = 00000000 (0)
但随后您将重用u
数组
'0' ^ 0 = 0011000 (48)
'0' ^ 1 = 0011001 (49)
'1' ^ 0 = 0011001 (49)
'1' ^ 1 = 0011000 (48)
在这种特殊情况下,请阅读@FoggyDay,无任何内容。对于原始二进制数据总是使用uint8_t
,这是一种很好的做法,但是对于字符串使用char
也可以(只有在那时)。在这种特殊情况下,读取@FoggyDay,不读取任何内容。对于原始二进制数据总是使用uint8\t
,这是一种很好的做法,但是对于字符串使用char
是很好的(只有这样)。