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.
  • 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