基本上我尝试读取文件,更改每个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);
}
}
答案 0 :(得分:4)
KIIV已经有效地为您提供了(令人难以置信的 - 相对简单的)解决方案,所以我只是在行动中展示它并解释它的工作原理(我无法抗拒,这里的代码缩减太漂亮了,我承认我和xor有过恋情并不感到羞耻。)
新代码:
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;
while (f.get(c))
f_o.put(c ^ 0x11);
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);
while (f2.get(c))
f_o2.put(c ^ 0x11);
}
按位独占或(XOR)
运算符^执行按位异或,即“XOR”运算。它的工作原理是逐位(按位!),如下所示:
0 ^ 0 -> 0
0 ^ 1 -> 1
1 ^ 0 -> 1
1 ^ 1 -> 0
换句话说,A ^ B
是1,如果 1,只有一个的A,B是1.因此'exclusive'或。
位翻转^
Xor是一个非常有趣的按位运算。除了其他有趣的属性之外,它是完美的工具,当你需要“翻转”一点状态时(即,将1映射到0或0到1)。
假设我选择A ^ 1
。如果A为0,那么我有0 ^ 1 = 1
。如果A是1,那么我有1 ^ 1 = 0
。所以你看,如果我用1稍微算一下,我就会有效地“翻转”这个位。
OTOH,假设我接受A ^ 0
。如果A为0,那么我有0 ^ 0 = 0
。如果A是1,那么我有1 ^ 0 = 1
。换句话说,A ^ 0 = A
!
这是一个完美的情况......我们可以用你的字节构造一个xor的位串,并且该位串中的每个位将决定你的字节中的相应位是否被翻转!
<强> 0×11 强>
唯一需要了解的是如何创建翻转所需位数所需的值。你想要翻转第4和第8位。所以我们需要构建00010001
。如果你知道十六进制,那么很明显这是0x11
。如果没有,请使用在线转换器,然后在完成此项目后学习十六进制.voila:)