C++ 我试图理解xor操作后指针变量的变化
我有一个小程序,它对两个字符*执行异或运算,但我不能判断b1在函数调用后是否发生了变化。当我尝试执行std::cout时,程序不会打印任何内容C++ 我试图理解xor操作后指针变量的变化,c++,pointers,char-pointer,C++,Pointers,Char Pointer,我有一个小程序,它对两个字符*执行异或运算,但我不能判断b1在函数调用后是否发生了变化。当我尝试执行std::cout时,程序不会打印任何内容 #include <iostream> #include <malloc.h> #include <cstring> void xorBlocks(char *b1, char *b2) { for (int i = 0; i <5; i++) { b1[i] ^= b2[i]; } std:
#include <iostream>
#include <malloc.h>
#include <cstring>
void xorBlocks(char *b1, char *b2) {
for (int i = 0; i <5; i++) {
b1[i] ^= b2[i];
}
std::cout <<b1;
}
int main()
{
char* buffer = (char *) malloc(10);
char* previousBlock = (char *) malloc(10);
const char *iv = (const char *)"00111";
//printf(iv);
memcpy(previousBlock, iv, 5);
//printf(previousBlock);
memcpy(buffer, iv, 5);
//printf(buffer);
xorBlocks((char *) buffer, (char *) previousBlock);
return 0;
}
#包括
#包括
#包括
无效xorBlocks(字符*b1,字符*b2){
对于(int i=0;i此函数
void xorBlocks(char *b1, char *b2) {
for (int i = 0; i <5; i++) {
b1[i] ^= b2[i];
}
std::cout <<b1;
}
及
都是多余的,你可以直接写
const char *iv = "00111";
及
函数应该声明为
void xorBlocks(char *b1, const char *b2);
因为指针b2指向的字符在函数中不会更改
和C++中,你应该使用new new来代替函数Malc。
你尝试使用两个相同的值的XOR。
const char *iv = (const char *)"00111";
memcpy(previousBlock, iv, 5);
memcpy(buffer, iv, 5);
如果两位相同(均为0或均为1),则xor返回0
因此,您有一行(buffer
)=\0\0\0\0
如果您无法理解字符串中的内容,只需打印所有字符的代码即可
for (char c : buffer)
std::cout << int(c) << ' ';
for(字符c:缓冲区)
std::cout所有这些(char*)
和(const char*)
禁用类型安全。唯一需要的是malloc
旁边的那些,但是malloc
不应该在这里使用。char buffer[10];
要好得多,即使是std::array buffer;
也值得考虑。b1
和b2
的第一个字节都是“0”(十进制48)“'0'异或'0'的计算结果为0。因此b1的第一个字节变为0,这意味着b1
是一个空字符串,并且不打印任何内容。x^x
对于所有整数x
。在我看来,b1
在std::cout
用作b1[0]时指向以空结尾的字符串
将是'\0'
@FrançoisAndrieux,您正在编写。我没有注意。@vladfromscow由于提供给它的值,这一次恰好是正确的,但是xorblock
也可以从其他情况下的保证中受益。
xorBlocks( buffer, previousBlock);
void xorBlocks(char *b1, const char *b2);
const char *iv = (const char *)"00111";
memcpy(previousBlock, iv, 5);
memcpy(buffer, iv, 5);
for (char c : buffer)
std::cout << int(c) << ' ';