Skip to content
  • Categories
  • Recent
  • Tags
  • Popular
  • Users
  • Groups
  • Search
  • Get Qt Extensions
  • Unsolved
Collapse
Brand Logo
  1. Home
  2. Qt Development
  3. General and Desktop
  4. Encode/decode to binary file
Forum Updated to NodeBB v4.3 + New Features

Encode/decode to binary file

Scheduled Pinned Locked Moved Unsolved General and Desktop
35 Posts 7 Posters 9.7k Views 1 Watching
  • Oldest to Newest
  • Newest to Oldest
  • Most Votes
Reply
  • Reply as topic
Log in to reply
This topic has been deleted. Only users with topic management privileges can see it.
  • mrjjM mrjj

    Hi
    I read it as he just want a binary file but do not understand that
    some editors will not show the raw binary but show
    it translated. So not sure he wants ASCII 0 and 1 but meant
    it as a way to say binary which QDataStream already is :)

    jsulmJ Offline
    jsulmJ Offline
    jsulm
    Lifetime Qt Champion
    wrote on last edited by
    #14

    @mrjj @Hollywood33 OK, then I would suggest to use a hex-editor instead of a text editor :-)

    https://forum.qt.io/topic/113070/qt-code-of-conduct

    1 Reply Last reply
    3
    • jsulmJ jsulm

      @Hollywood33 said in Encode/decode to binary file:

      It has to work with all file extensions and file sizes.

      What does it have to do with file extension and file size?!
      If I understood you correctly all you want to do is writing a text file containing 0 and 1 as characters, right?
      File extension is simply part of file name and does not define its format. You could store a picture as "mypicture.xml" - it still would be a picture and not XML.
      If you would have checked the documentation (http://doc.qt.io/qt-5/qfile.html) you would have found this:

      QFile file("out.txt");
      if (!file.open(QIODevice::WriteOnly | QIODevice::Text))
          return;
      
      QTextStream out(&file);
      out << "The magic number is: " << 49 << "\n";
      
      H Offline
      H Offline
      Hollywood33
      wrote on last edited by
      #15

      @jsulm it writes plain text.
      I want file to be saved in .txt file as sequence of 0 and 1. It must look like 01010001 in simple text editor, like Notepad, not HEX viewer.

      jsulmJ 1 Reply Last reply
      0
      • H Hollywood33

        @jsulm it writes plain text.
        I want file to be saved in .txt file as sequence of 0 and 1. It must look like 01010001 in simple text editor, like Notepad, not HEX viewer.

        jsulmJ Offline
        jsulmJ Offline
        jsulm
        Lifetime Qt Champion
        wrote on last edited by
        #16

        @Hollywood33 Then you want to write text. Because text editors (like the name suggests) only understand text. It wouldn't be a binary file. You would write 1 and 0 as characters:

        QFile file("out.txt");
        if (!file.open(QIODevice::WriteOnly | QIODevice::Text))
            return;
        
        QTextStream out(&file);
        out << "010001100101110";
        

        You need to understand the difference between text and binary. 0 as character in a text file is stored as ASCII number 48, 1 is 49. That means if you store 01 in a text file and open it in a hex editor you will see 4849 (or 0x30 0x31 as hex).

        https://forum.qt.io/topic/113070/qt-code-of-conduct

        H 1 Reply Last reply
        1
        • jsulmJ jsulm

          @Hollywood33 Then you want to write text. Because text editors (like the name suggests) only understand text. It wouldn't be a binary file. You would write 1 and 0 as characters:

          QFile file("out.txt");
          if (!file.open(QIODevice::WriteOnly | QIODevice::Text))
              return;
          
          QTextStream out(&file);
          out << "010001100101110";
          

          You need to understand the difference between text and binary. 0 as character in a text file is stored as ASCII number 48, 1 is 49. That means if you store 01 in a text file and open it in a hex editor you will see 4849 (or 0x30 0x31 as hex).

          H Offline
          H Offline
          Hollywood33
          wrote on last edited by
          #17

          @jsulm i know the difference between text and binary code.
          I want to see 0&1's as UTF-8 text in *.txt file. What you have written is only writes text into file.

          jsulmJ 1 Reply Last reply
          -1
          • H Hollywood33

            @jsulm i know the difference between text and binary code.
            I want to see 0&1's as UTF-8 text in *.txt file. What you have written is only writes text into file.

            jsulmJ Offline
            jsulmJ Offline
            jsulm
            Lifetime Qt Champion
            wrote on last edited by
            #18

            @Hollywood33 '1' and '0' are same in ASCII and UTF-8 as far as I know...

            https://forum.qt.io/topic/113070/qt-code-of-conduct

            1 Reply Last reply
            0
            • J.HilkJ Offline
              J.HilkJ Offline
              J.Hilk
              Moderators
              wrote on last edited by J.Hilk
              #19

              because I'm a good guy :-)

              QString toBitString(const QVariant &v)
              {
                  QByteArray bytes = v.toByteArray();
                  QString bitString;
              
                  QChar Zero('0');
                  QChar One('1');
              
                  for(int y(0); y <bytes.size(); y++){
                      for(int i(0); i < 8; i++){
                          bool b = (bytes[y] >> i) & 1;
                          bitString.append(b ? One:Zero);
                      }
                  }
                  return bitString;
              }
              

              Edit:
              Small edit in the code example, v.toByteArray().data() totally unnecessary!


              Be aware of the Qt Code of Conduct, when posting : https://forum.qt.io/topic/113070/qt-code-of-conduct


              Q: What's that?
              A: It's blue light.
              Q: What does it do?
              A: It turns blue.

              H 1 Reply Last reply
              2
              • J.HilkJ J.Hilk

                because I'm a good guy :-)

                QString toBitString(const QVariant &v)
                {
                    QByteArray bytes = v.toByteArray();
                    QString bitString;
                
                    QChar Zero('0');
                    QChar One('1');
                
                    for(int y(0); y <bytes.size(); y++){
                        for(int i(0); i < 8; i++){
                            bool b = (bytes[y] >> i) & 1;
                            bitString.append(b ? One:Zero);
                        }
                    }
                    return bitString;
                }
                

                Edit:
                Small edit in the code example, v.toByteArray().data() totally unnecessary!

                H Offline
                H Offline
                Hollywood33
                wrote on last edited by
                #20

                @J.Hilk It looks like what I need. It remains only to understand how to use it with QFileDialog.

                mrjjM Cobra91151C 2 Replies Last reply
                0
                • H Hollywood33

                  @J.Hilk It looks like what I need. It remains only to understand how to use it with QFileDialog.

                  mrjjM Offline
                  mrjjM Offline
                  mrjj
                  Lifetime Qt Champion
                  wrote on last edited by
                  #21

                  @Hollywood33
                  Hi
                  The docs shows how to use it.
                  http://doc.qt.io/qt-5/qfiledialog.html
                  It has sample :)

                  1 Reply Last reply
                  0
                  • H Hollywood33

                    @J.Hilk It looks like what I need. It remains only to understand how to use it with QFileDialog.

                    Cobra91151C Offline
                    Cobra91151C Offline
                    Cobra91151
                    wrote on last edited by
                    #22

                    @Hollywood33

                    Ok, here is the code how I would save it with QFileDialog class using @J-Hilk solution.

                    QString filters = "Text Documents (*.txt);;All files (*.*)";
                    QString filePath = QFileDialog::getSaveFileName(this, "Save binary file", qApp->applicationDirPath() + "/MyFile", filters, nullptr);
                    
                     if (!filePath.isEmpty()) {
                          QFile *myFile = new QFile(filePath);
                          myFile->open(QIODevice::WriteOnly);
                          QTextStream myTextStream(myFile); //QTextStream is used because you want to save it in .txt file
                          myTextStream << toBitString(QString("This is a test!"));
                          myFile->close();
                          myFile->deleteLater();
                          QMessageBox::information(this, "Information", "Binary file is saved!", QMessageBox::Ok);
                     }
                    
                    mrjjM H 2 Replies Last reply
                    2
                    • Cobra91151C Cobra91151

                      @Hollywood33

                      Ok, here is the code how I would save it with QFileDialog class using @J-Hilk solution.

                      QString filters = "Text Documents (*.txt);;All files (*.*)";
                      QString filePath = QFileDialog::getSaveFileName(this, "Save binary file", qApp->applicationDirPath() + "/MyFile", filters, nullptr);
                      
                       if (!filePath.isEmpty()) {
                            QFile *myFile = new QFile(filePath);
                            myFile->open(QIODevice::WriteOnly);
                            QTextStream myTextStream(myFile); //QTextStream is used because you want to save it in .txt file
                            myTextStream << toBitString(QString("This is a test!"));
                            myFile->close();
                            myFile->deleteLater();
                            QMessageBox::information(this, "Information", "Binary file is saved!", QMessageBox::Ok);
                       }
                      
                      mrjjM Offline
                      mrjjM Offline
                      mrjj
                      Lifetime Qt Champion
                      wrote on last edited by
                      #23

                      @Cobra91151
                      Hi
                      Just as a note.
                      There is really no need to new the QFile.
                      QFile myFile;
                      will work just as fine as it has no need to survive the scope/function.
                      but you do delete it so no leak but no real benefit :)

                      Cobra91151C 1 Reply Last reply
                      4
                      • mrjjM mrjj

                        @Cobra91151
                        Hi
                        Just as a note.
                        There is really no need to new the QFile.
                        QFile myFile;
                        will work just as fine as it has no need to survive the scope/function.
                        but you do delete it so no leak but no real benefit :)

                        Cobra91151C Offline
                        Cobra91151C Offline
                        Cobra91151
                        wrote on last edited by
                        #24

                        @mrjj

                        Hi! Yes, you right, in this example better to use QFile myFile on the stack.

                        1 Reply Last reply
                        1
                        • Cobra91151C Cobra91151

                          @Hollywood33

                          Ok, here is the code how I would save it with QFileDialog class using @J-Hilk solution.

                          QString filters = "Text Documents (*.txt);;All files (*.*)";
                          QString filePath = QFileDialog::getSaveFileName(this, "Save binary file", qApp->applicationDirPath() + "/MyFile", filters, nullptr);
                          
                           if (!filePath.isEmpty()) {
                                QFile *myFile = new QFile(filePath);
                                myFile->open(QIODevice::WriteOnly);
                                QTextStream myTextStream(myFile); //QTextStream is used because you want to save it in .txt file
                                myTextStream << toBitString(QString("This is a test!"));
                                myFile->close();
                                myFile->deleteLater();
                                QMessageBox::information(this, "Information", "Binary file is saved!", QMessageBox::Ok);
                           }
                          
                          H Offline
                          H Offline
                          Hollywood33
                          wrote on last edited by
                          #25

                          @Cobra91151 can't build: nullptr is not declared in this scope;
                          tobitstring is not declared in this scope

                          mrjjM Cobra91151C 2 Replies Last reply
                          0
                          • H Hollywood33

                            @Cobra91151 can't build: nullptr is not declared in this scope;
                            tobitstring is not declared in this scope

                            mrjjM Offline
                            mrjjM Offline
                            mrjj
                            Lifetime Qt Champion
                            wrote on last edited by
                            #26

                            @Hollywood33
                            odd it dont know nullptr but you can use 0 (zero) or NULL instead
                            also just remove
                            myTextStream << toBitString(QString("This is a test!"));
                            --->
                            myTextStream << QString("This is a test!");

                            Cobra91151C H 2 Replies Last reply
                            1
                            • mrjjM mrjj

                              @Hollywood33
                              odd it dont know nullptr but you can use 0 (zero) or NULL instead
                              also just remove
                              myTextStream << toBitString(QString("This is a test!"));
                              --->
                              myTextStream << QString("This is a test!");

                              Cobra91151C Offline
                              Cobra91151C Offline
                              Cobra91151
                              wrote on last edited by
                              #27

                              @mrjj

                              The code - myTextStream << QString("This is a test!"); will write only text not bit representation as he wants. So it must be - myTextStream << toBitString(QString("This is a test!"));

                              1 Reply Last reply
                              2
                              • H Hollywood33

                                @Cobra91151 can't build: nullptr is not declared in this scope;
                                tobitstring is not declared in this scope

                                Cobra91151C Offline
                                Cobra91151C Offline
                                Cobra91151
                                wrote on last edited by Cobra91151
                                #28

                                @Hollywood33

                                You must declare tobitstring function in the header (.h file) to use it. + Specify more info about your building process (Qt version, compiler, OS)?

                                Also, instead of nullptr, you can use - Q_NULLPTR macro or add the QString *selectedFilter as the parameter points to in the docs - QFileDialog.

                                H 1 Reply Last reply
                                0
                                • mrjjM mrjj

                                  @Hollywood33
                                  odd it dont know nullptr but you can use 0 (zero) or NULL instead
                                  also just remove
                                  myTextStream << toBitString(QString("This is a test!"));
                                  --->
                                  myTextStream << QString("This is a test!");

                                  H Offline
                                  H Offline
                                  Hollywood33
                                  wrote on last edited by
                                  #29

                                  @mrjj it writes test text, no 0&1s.

                                  I was told to read into QByteArray and then send it to stream:
                                  QFile f("/Users/ro888.jpg");
                                  f.open(QIODevice::ReadOnly);
                                  QByteArray ba = f.readAll();
                                  stream << ba;

                                  So I have to update code in the following example using QByteArray:
                                  How to do it?

                                  void MainWindow::on_pushButton_3_clicked()
                                  {
                                  QFile file("/Users/file.bin");
                                  if(file.open(QIODevice::WriteOnly))
                                  {
                                  QDataStream stream(&file);
                                  stream. setVersion(QDataStream::Qt_4_2);
                                  stream << QPointF(30, 30) << QImage("/Users/ro888.jpg");
                                  if(stream.status() != QDataStream::Ok)
                                  {
                                  qDebug() << "Error";
                                  }
                                  }
                                  file.close();
                                  }

                                  mrjjM 2 Replies Last reply
                                  0
                                  • H Hollywood33

                                    @mrjj it writes test text, no 0&1s.

                                    I was told to read into QByteArray and then send it to stream:
                                    QFile f("/Users/ro888.jpg");
                                    f.open(QIODevice::ReadOnly);
                                    QByteArray ba = f.readAll();
                                    stream << ba;

                                    So I have to update code in the following example using QByteArray:
                                    How to do it?

                                    void MainWindow::on_pushButton_3_clicked()
                                    {
                                    QFile file("/Users/file.bin");
                                    if(file.open(QIODevice::WriteOnly))
                                    {
                                    QDataStream stream(&file);
                                    stream. setVersion(QDataStream::Qt_4_2);
                                    stream << QPointF(30, 30) << QImage("/Users/ro888.jpg");
                                    if(stream.status() != QDataStream::Ok)
                                    {
                                    qDebug() << "Error";
                                    }
                                    }
                                    file.close();
                                    }

                                    mrjjM Offline
                                    mrjjM Offline
                                    mrjj
                                    Lifetime Qt Champion
                                    wrote on last edited by
                                    #30

                                    @Hollywood33
                                    Hi
                                    Yes sorry my bad.
                                    I missed that QString toBitString(const QVariant &v) was the function @J-Hilk provided :)
                                    So place
                                    QString toBitString(const QVariant &v) in .h and
                                    the body in the cpp as @Cobra91151 says :)

                                    1 Reply Last reply
                                    3
                                    • H Hollywood33

                                      @mrjj it writes test text, no 0&1s.

                                      I was told to read into QByteArray and then send it to stream:
                                      QFile f("/Users/ro888.jpg");
                                      f.open(QIODevice::ReadOnly);
                                      QByteArray ba = f.readAll();
                                      stream << ba;

                                      So I have to update code in the following example using QByteArray:
                                      How to do it?

                                      void MainWindow::on_pushButton_3_clicked()
                                      {
                                      QFile file("/Users/file.bin");
                                      if(file.open(QIODevice::WriteOnly))
                                      {
                                      QDataStream stream(&file);
                                      stream. setVersion(QDataStream::Qt_4_2);
                                      stream << QPointF(30, 30) << QImage("/Users/ro888.jpg");
                                      if(stream.status() != QDataStream::Ok)
                                      {
                                      qDebug() << "Error";
                                      }
                                      }
                                      file.close();
                                      }

                                      mrjjM Offline
                                      mrjjM Offline
                                      mrjj
                                      Lifetime Qt Champion
                                      wrote on last edited by
                                      #31

                                      @Hollywood33
                                      Hi
                                      Yes using QDataStream will be a binary file.
                                      You paths for the JPG files looks a bit odd but if you are sure they are valid then
                                      should produce a truly binary file :)

                                      1 Reply Last reply
                                      0
                                      • Cobra91151C Cobra91151

                                        @Hollywood33

                                        You must declare tobitstring function in the header (.h file) to use it. + Specify more info about your building process (Qt version, compiler, OS)?

                                        Also, instead of nullptr, you can use - Q_NULLPTR macro or add the QString *selectedFilter as the parameter points to in the docs - QFileDialog.

                                        H Offline
                                        H Offline
                                        Hollywood33
                                        wrote on last edited by
                                        #32

                                        @Cobra91151 I'm on Qt 5.1.0, OS X 10.6.8
                                        I added to header #include "tobitstring.h" - error: no such file or directory

                                        Cobra91151C 1 Reply Last reply
                                        0
                                        • H Hollywood33

                                          @Cobra91151 I'm on Qt 5.1.0, OS X 10.6.8
                                          I added to header #include "tobitstring.h" - error: no such file or directory

                                          Cobra91151C Offline
                                          Cobra91151C Offline
                                          Cobra91151
                                          wrote on last edited by
                                          #33

                                          @Hollywood33 said in Encode/decode to binary file:

                                          @Cobra91151 I'm on Qt 5.1.0, OS X 10.6.8
                                          I added to header #include "tobitstring.h" - error: no such file or directory

                                          You should add the prototype of the function to header file, not include it. Include works for additional files, not for functions!

                                          For example:

                                          test.h file:

                                          public:
                                              explicit Test(QWidget *parent = 0);
                                              QString toBitString(const QVariant &v);
                                              ~Test();
                                          

                                          It contains a constructor, prototype function and destructor.
                                          And then put the body of the function in test.cpp file like this:

                                          QString Test::toBitString(const QVariant &v)
                                          {
                                              QByteArray bytes = v.toByteArray();
                                              QString bitString = "";
                                          
                                              QChar Zero('0');
                                              QChar One('1');
                                          
                                              for (int y(0); y <bytes.size(); y++){
                                                  for (int i(0); i < 8; i++){
                                                      bool b = (bytes[y] >> i) & 1;
                                                      bitString.append(b ? One:Zero);
                                                  }
                                              }
                                          
                                              return bitString;
                                          }
                                          

                                          Your class is - MainWindow, Test is just for testing purposes.

                                          J.HilkJ 1 Reply Last reply
                                          3

                                          • Login

                                          • Login or register to search.
                                          • First post
                                            Last post
                                          0
                                          • Categories
                                          • Recent
                                          • Tags
                                          • Popular
                                          • Users
                                          • Groups
                                          • Search
                                          • Get Qt Extensions
                                          • Unsolved