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

    @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