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.0k 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
    4 Apr 2018, 09:39

    @J.Hilk I opened it in TextEdit on mac, notepad in Win. You are right, I need sequence of "0" and "1" in .txt file. Please write example using QFileDialog.
    It has to work with all file extensions and file sizes.

    J Offline
    J Offline
    jsulm
    Lifetime Qt Champion
    wrote on 4 Apr 2018, 10:34 last edited by jsulm 4 Apr 2018, 10:34
    #12

    @Hollywood33 said in Encode/decode to binary file:

    It has to work with all file extensions and file sizes.

    What does it have to do with file extension and file size?!
    If I understood you correctly all you want to do is writing a text file containing 0 and 1 as characters, right?
    File extension is simply part of file name and does not define its format. You could store a picture as "mypicture.xml" - it still would be a picture and not XML.
    If you would have checked the documentation (http://doc.qt.io/qt-5/qfile.html) you would have found this:

    QFile file("out.txt");
    if (!file.open(QIODevice::WriteOnly | QIODevice::Text))
        return;
    
    QTextStream out(&file);
    out << "The magic number is: " << 49 << "\n";
    

    https://forum.qt.io/topic/113070/qt-code-of-conduct

    H 1 Reply Last reply 4 Apr 2018, 11:11
    3
    • M Offline
      M Offline
      mrjj
      Lifetime Qt Champion
      wrote on 4 Apr 2018, 10:37 last edited by
      #13

      Hi
      I read it as he just want a binary file but do not understand that
      some editors will not show the raw binary but show
      it translated. So not sure he wants ASCII 0 and 1 but meant
      it as a way to say binary which QDataStream already is :)

      J 1 Reply Last reply 4 Apr 2018, 10:39
      4
      • M mrjj
        4 Apr 2018, 10:37

        Hi
        I read it as he just want a binary file but do not understand that
        some editors will not show the raw binary but show
        it translated. So not sure he wants ASCII 0 and 1 but meant
        it as a way to say binary which QDataStream already is :)

        J Offline
        J Offline
        jsulm
        Lifetime Qt Champion
        wrote on 4 Apr 2018, 10:39 last edited by
        #14

        @mrjj @Hollywood33 OK, then I would suggest to use a hex-editor instead of a text editor :-)

        https://forum.qt.io/topic/113070/qt-code-of-conduct

        1 Reply Last reply
        3
        • J jsulm
          4 Apr 2018, 10:34

          @Hollywood33 said in Encode/decode to binary file:

          It has to work with all file extensions and file sizes.

          What does it have to do with file extension and file size?!
          If I understood you correctly all you want to do is writing a text file containing 0 and 1 as characters, right?
          File extension is simply part of file name and does not define its format. You could store a picture as "mypicture.xml" - it still would be a picture and not XML.
          If you would have checked the documentation (http://doc.qt.io/qt-5/qfile.html) you would have found this:

          QFile file("out.txt");
          if (!file.open(QIODevice::WriteOnly | QIODevice::Text))
              return;
          
          QTextStream out(&file);
          out << "The magic number is: " << 49 << "\n";
          
          H Offline
          H Offline
          Hollywood33
          wrote on 4 Apr 2018, 11:11 last edited by
          #15

          @jsulm it writes plain text.
          I want file to be saved in .txt file as sequence of 0 and 1. It must look like 01010001 in simple text editor, like Notepad, not HEX viewer.

          J 1 Reply Last reply 4 Apr 2018, 11:16
          0
          • H Hollywood33
            4 Apr 2018, 11:11

            @jsulm it writes plain text.
            I want file to be saved in .txt file as sequence of 0 and 1. It must look like 01010001 in simple text editor, like Notepad, not HEX viewer.

            J Offline
            J Offline
            jsulm
            Lifetime Qt Champion
            wrote on 4 Apr 2018, 11:16 last edited by
            #16

            @Hollywood33 Then you want to write text. Because text editors (like the name suggests) only understand text. It wouldn't be a binary file. You would write 1 and 0 as characters:

            QFile file("out.txt");
            if (!file.open(QIODevice::WriteOnly | QIODevice::Text))
                return;
            
            QTextStream out(&file);
            out << "010001100101110";
            

            You need to understand the difference between text and binary. 0 as character in a text file is stored as ASCII number 48, 1 is 49. That means if you store 01 in a text file and open it in a hex editor you will see 4849 (or 0x30 0x31 as hex).

            https://forum.qt.io/topic/113070/qt-code-of-conduct

            H 1 Reply Last reply 4 Apr 2018, 11:32
            1
            • J jsulm
              4 Apr 2018, 11:16

              @Hollywood33 Then you want to write text. Because text editors (like the name suggests) only understand text. It wouldn't be a binary file. You would write 1 and 0 as characters:

              QFile file("out.txt");
              if (!file.open(QIODevice::WriteOnly | QIODevice::Text))
                  return;
              
              QTextStream out(&file);
              out << "010001100101110";
              

              You need to understand the difference between text and binary. 0 as character in a text file is stored as ASCII number 48, 1 is 49. That means if you store 01 in a text file and open it in a hex editor you will see 4849 (or 0x30 0x31 as hex).

              H Offline
              H Offline
              Hollywood33
              wrote on 4 Apr 2018, 11:32 last edited by
              #17

              @jsulm i know the difference between text and binary code.
              I want to see 0&1's as UTF-8 text in *.txt file. What you have written is only writes text into file.

              J 1 Reply Last reply 4 Apr 2018, 11:35
              -1
              • H Hollywood33
                4 Apr 2018, 11:32

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

                J Offline
                J Offline
                jsulm
                Lifetime Qt Champion
                wrote on 4 Apr 2018, 11:35 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 Offline
                  J Offline
                  J.Hilk
                  Moderators
                  wrote on 4 Apr 2018, 11:37 last edited by J.Hilk 4 Apr 2018, 12:34
                  #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 4 Apr 2018, 12:28
                  2
                  • J J.Hilk
                    4 Apr 2018, 11:37

                    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 4 Apr 2018, 12:28 last edited by
                    #20

                    @J.Hilk It looks like what I need. It remains only to understand how to use it with QFileDialog.

                    M C 2 Replies Last reply 4 Apr 2018, 13:18
                    0
                    • H Hollywood33
                      4 Apr 2018, 12:28

                      @J.Hilk It looks like what I need. It remains only to understand how to use it with QFileDialog.

                      M Offline
                      M Offline
                      mrjj
                      Lifetime Qt Champion
                      wrote on 4 Apr 2018, 13:18 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
                        4 Apr 2018, 12:28

                        @J.Hilk It looks like what I need. It remains only to understand how to use it with QFileDialog.

                        C Offline
                        C Offline
                        Cobra91151
                        wrote on 4 Apr 2018, 20:38 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);
                         }
                        
                        M H 2 Replies Last reply 4 Apr 2018, 20:44
                        2
                        • C Cobra91151
                          4 Apr 2018, 20:38

                          @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);
                           }
                          
                          M Offline
                          M Offline
                          mrjj
                          Lifetime Qt Champion
                          wrote on 4 Apr 2018, 20:44 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 :)

                          C 1 Reply Last reply 4 Apr 2018, 20:51
                          4
                          • M mrjj
                            4 Apr 2018, 20:44

                            @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 :)

                            C Offline
                            C Offline
                            Cobra91151
                            wrote on 4 Apr 2018, 20:51 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
                            • C Cobra91151
                              4 Apr 2018, 20:38

                              @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 5 Apr 2018, 13:18 last edited by
                              #25

                              @Cobra91151 can't build: nullptr is not declared in this scope;
                              tobitstring is not declared in this scope

                              M C 2 Replies Last reply 5 Apr 2018, 15:04
                              0
                              • H Hollywood33
                                5 Apr 2018, 13:18

                                @Cobra91151 can't build: nullptr is not declared in this scope;
                                tobitstring is not declared in this scope

                                M Offline
                                M Offline
                                mrjj
                                Lifetime Qt Champion
                                wrote on 5 Apr 2018, 15:04 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!");

                                C H 2 Replies Last reply 5 Apr 2018, 15:57
                                1
                                • M mrjj
                                  5 Apr 2018, 15:04

                                  @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!");

                                  C Offline
                                  C Offline
                                  Cobra91151
                                  wrote on 5 Apr 2018, 15:57 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
                                    5 Apr 2018, 13:18

                                    @Cobra91151 can't build: nullptr is not declared in this scope;
                                    tobitstring is not declared in this scope

                                    C Offline
                                    C Offline
                                    Cobra91151
                                    wrote on 5 Apr 2018, 15:59 last edited by Cobra91151 4 May 2018, 16:02
                                    #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 5 Apr 2018, 16:36
                                    0
                                    • M mrjj
                                      5 Apr 2018, 15:04

                                      @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 5 Apr 2018, 16:03 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();
                                      }

                                      M 2 Replies Last reply 5 Apr 2018, 16:05
                                      0
                                      • H Hollywood33
                                        5 Apr 2018, 16:03

                                        @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();
                                        }

                                        M Offline
                                        M Offline
                                        mrjj
                                        Lifetime Qt Champion
                                        wrote on 5 Apr 2018, 16:05 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
                                          5 Apr 2018, 16:03

                                          @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();
                                          }

                                          M Offline
                                          M Offline
                                          mrjj
                                          Lifetime Qt Champion
                                          wrote on 5 Apr 2018, 16:09 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

                                          21/35

                                          4 Apr 2018, 13:18

                                          • Login

                                          • Login or register to search.
                                          21 out of 35
                                          • First post
                                            21/35
                                            Last post
                                          0
                                          • Categories
                                          • Recent
                                          • Tags
                                          • Popular
                                          • Users
                                          • Groups
                                          • Search
                                          • Get Qt Extensions
                                          • Unsolved