逐位写文件

时间:2017-05-10 10:05:10

标签: c++ file binary fstream

基本上我尝试读取文件,更改每个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); 
    }

}

1 个答案:

答案 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:)