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