【发布时间】:2017-10-08 21:58:39
【问题描述】:
基本上我正在尝试读取一个文件,更改每个 4 位序列的最后一位,然后读取更改后的文件并将其恢复为原始文件。 es test1.bin -> test2.bin -> test3.bin 00011100 -> 00001101 -> 00011100 但是,虽然第二个文件没问题,但第三个文件每 8 次而不是 4 次更改一次。这是
int main(int argc, char** argv) {
ifstream f("C:\\Users\\simon\\Desktop\\test\\test.bin", ios::binary | ios::in);
ofstream f_o("C:\\Users\\simon\\Desktop\\test\\test2.bin", ios::binary | ios::out);
char c,app;
int rund=0;
while (f.get(c)){
app=c;
for (int i = 7; i >= 0; i--){
if(rund==3){ //it's the 4th bit, I change it
rund=0;
if(((c >> i) & 1) == 0) app |= 1 << i; //if it's 0 i change to 1
else app |= 0 << i;
}
else rund += 1;
}
f_o.put(app);
}
f.close();
f_o.close();
ifstream f2("C:\\Users\\simon\\Desktop\\test\\test2.bin", ios::binary | ios::in);
ofstream f_o2("C:\\Users\\simon\\Desktop\\test\\test3.bin", ios::binary | ios::out);
rund=0;
while (f2.get(c)){
app=c;
for (int i = 7; i >= 0; i--){
if(rund==3){
rund=0;
if(((c >> i) & 1) == 0) app |= 1 << i;
else app |= 0 << i;
}
else rund += 1;
}
f_o2.put(app);
}
}
【问题讨论】:
-
将您的问题缩小到更具体的问题。这称为“调试”。
-
是的。使用称为“调试”的技术将您的问题缩小到更具体的问题。您生成的 minimal reproducible example 应该有 4-8 行(但仍然是一个完整的 C++ 程序)。不过,在您需要在此处发布相关问题之前,制作此 MCVE 的行为将向您揭示问题的可能性是好的。这是目的的一部分。
-
你为什么不直接使用
c2 ^= 0x11;? -
我正在帮助你;你只是还不知道。 :)
-
@alteration 这是一个按位异或运算,花点时间理解它会将该代码的长度减少....bignum%。使用异或,您可以翻转这些位 1) 而不循环它们,以及 2) 使用相同的操作,无论该位当前是 1 还是 0(使用 xor 您可以“翻转”位的状态)。