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 10.4k 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.
  • 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
                                      • Cobra91151C Cobra91151

                                        @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 Offline
                                        J.HilkJ Offline
                                        J.Hilk
                                        Moderators
                                        wrote on last edited by
                                        #34

                                        @Cobra91151 I have to compliment your patience. *Thumbs up*


                                        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.

                                        1 Reply Last reply
                                        3
                                        • VRoninV Offline
                                          VRoninV Offline
                                          VRonin
                                          wrote on last edited by VRonin
                                          #35

                                          You can simplify it:

                                          QString Test::toBitString(const QVariant &v)
                                          {
                                              const QByteArray bytes = v.toByteArray();
                                              QString bitString;
                                          for(const char* singlebyte = bytes.begin();singlebyte != bytes.end();++singlebyte)
                                          bitString.append(QString::number(*singlebyte,2));
                                              return bitString;
                                          }
                                          

                                          But still looks absolutely useless to me

                                          "La mort n'est rien, mais vivre vaincu et sans gloire, c'est mourir tous les jours"
                                          ~Napoleon Bonaparte

                                          On a crusade to banish setIndexWidget() from the holy land of Qt

                                          1 Reply Last reply
                                          5

                                          • Login

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