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.3k 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 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