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