Bypassing the EOF marker

Discussion in 'C++' started by philmasterplus, Apr 19, 2008.

  1. I am trying to create a simple file encoder (obfuscator) class using
    the XOR(^) operator.

    I am using objects of the class ifstream and ofstream to input/output
    to the file. Right now, I am experimenting with xor-encoding a file
    with a given C-string.

    The problem is, the obfuscated file contains the EOF character for my
    system, and my program cannot proceed to reencode (decode) the rest of
    the obfuscated file.

    The code can be simplified as follows:

    <code>
    //Assuming all necessary includes are in place

    int main()
    {
    ifstream ifs("test.txt");
    char cbuf;
    string sbuf;

    //Other code blah blah blah...

    cbuf = ifs.get();
    while (!ifs.eof()) //Recognizes the EOF-marker-in-the-middle-of-the-
    file
    {
    sbuf.push_back(cbuf);
    cbuf = ifs.get();
    }

    //Other code blah blah blah...
    }

    </code>


    Yeah, I know, loading the whole file into a std::string variable is a
    BAD idea, but it's a temporary hack. Which brings me to another
    question: How do you xor-encode a file without opening an ifstream and
    an ofstream? I know about the std::fstream class, but I don't know how
    to use it.

    Any form of example code (preferably with indents) would be
    appreciated!

    P. S. please also comment on my programming style. On a request, I
    will upload the whole project.
     
    philmasterplus, Apr 19, 2008
    #1
    1. Advertisements

  2. philmasterplus

    Bo Persson Guest

    philmasterplus wrote:
    > I am trying to create a simple file encoder (obfuscator) class using
    > the XOR(^) operator.
    >
    > I am using objects of the class ifstream and ofstream to
    > input/output to the file. Right now, I am experimenting with
    > xor-encoding a file with a given C-string.
    >
    > The problem is, the obfuscated file contains the EOF character for
    > my system, and my program cannot proceed to reencode (decode) the
    > rest of the obfuscated file.
    >
    > The code can be simplified as follows:
    >
    > <code>
    > //Assuming all necessary includes are in place
    >
    > int main()
    > {
    > ifstream ifs("test.txt");
    > char cbuf;
    > string sbuf;
    >
    > //Other code blah blah blah...
    >
    > cbuf = ifs.get();
    > while (!ifs.eof()) //Recognizes the EOF-marker-in-the-middle-of-the-
    > file
    > {
    > sbuf.push_back(cbuf);
    > cbuf = ifs.get();
    > }
    >
    > //Other code blah blah blah...
    > }
    >
    > </code>
    >
    >
    > Yeah, I know, loading the whole file into a std::string variable is
    > a BAD idea, but it's a temporary hack. Which brings me to another
    > question: How do you xor-encode a file without opening an ifstream
    > and an ofstream? I know about the std::fstream class, but I don't
    > know how to use it.
    >
    > Any form of example code (preferably with indents) would be
    > appreciated!
    >
    > P. S. please also comment on my programming style. On a request, I
    > will upload the whole project.


    The way you handle it, it isn't really a text file, is it? Recognizing
    EOF markers inside the file, or not, is totally system dependent.
    There is no general rule for this.

    Your best shot will probably be to open the files in binary mode,
    like:

    ifstream ifs("test.txt", std::ios::binary);


    Bo Persson
     
    Bo Persson, Apr 19, 2008
    #2
    1. Advertisements

  3. philmasterplus

    James Kanze Guest

    On 19 avr, 14:23, philmasterplus <> wrote:
    > I am trying to create a simple file encoder (obfuscator) class
    > using the XOR(^) operator.


    > I am using objects of the class ifstream and ofstream to
    > input/output to the file. Right now, I am experimenting with
    > xor-encoding a file with a given C-string.


    > The problem is, the obfuscated file contains the EOF character
    > for my system, and my program cannot proceed to reencode
    > (decode) the rest of the obfuscated file.


    More to the point, the "obfuscated" file isn't text, so cannot
    be written (nor read) if the file is opened in text mode. You
    have two choices: open in binary, or use something like rot-13
    for obfuscation, which ensures that the obfuscated data is text.
    (Rot-13 is very minimal obfuscation, but throw in a little
    shuffling, and it should be as good or better than xor'ing.)

    > The code can be simplified as follows:
    >
    > <code>
    > //Assuming all necessary includes are in place
    > int main()
    > {
    > ifstream ifs("test.txt");


    If this is to read your obfuscated text:

    std::ifstream ifs( "test.txt", std::ios::binary ) ;

    And of course, in real code, you'll want to check that the open
    succeeded.

    > char cbuf;
    > string sbuf;


    > //Other code blah blah blah...


    > cbuf = ifs.get();
    > while (!ifs.eof()) //Recognizes the EOF-marker-in-the-middle-of-the-
    > file


    In theory, this test may cause you to miss the last character.
    There are two "classical" solutions:

    while ( ifs.get( cbuf ) ) { ...

    or declare cbuf as an int, and:

    while ( cbuf != EOF ) { ...

    --
    James Kanze (GABI Software) email:
    Conseils en informatique orientée objet/
    Beratung in objektorientierter Datenverarbeitung
    9 place Sémard, 78210 St.-Cyr-l'École, France, +33 (0)1 30 23 00 34
     
    James Kanze, Apr 19, 2008
    #3
    1. Advertisements

Want to reply to this thread or ask your own question?

It takes just 2 minutes to sign up (and it's free!). Just click the sign up button to choose a username and then you can ask your own questions on the forum.
Similar Threads
  1. Brian Henry

    top level marker?

    Brian Henry, Dec 26, 2003, in forum: ASP .Net
    Replies:
    2
    Views:
    412
    Brian Henry
    Dec 27, 2003
  2. zambak

    Insert EOF marker into file

    zambak, Nov 16, 2003, in forum: C Programming
    Replies:
    2
    Views:
    3,928
    Derk Gwen
    Nov 16, 2003
  3. Kobu
    Replies:
    10
    Views:
    722
    Keith Thompson
    Mar 4, 2005
  4. SpreadTooThin

    ifstream eof not reporting eof?

    SpreadTooThin, Jun 13, 2007, in forum: C++
    Replies:
    10
    Views:
    787
    James Kanze
    Jun 15, 2007
  5. Jan Burse
    Replies:
    67
    Views:
    1,229
    Jan Burse
    Mar 14, 2012
Loading...

Share This Page