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

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

    jsulmJ 1 Reply Last reply
    0
    • H Hollywood33

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

      jsulmJ Offline
      jsulmJ Offline
      jsulm
      Lifetime Qt Champion
      wrote on 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
      1
      • jsulmJ jsulm

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

        jsulmJ 1 Reply Last reply
        -1
        • H Hollywood33

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

          jsulmJ Offline
          jsulmJ Offline
          jsulm
          Lifetime Qt Champion
          wrote on last edited by
          #18

          @Hollywood33 '1' and '0' are same in ASCII and UTF-8 as far as I know...

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

          1 Reply Last reply
          0
          • J.HilkJ Offline
            J.HilkJ Offline
            J.Hilk
            Moderators
            wrote on last edited by J.Hilk
            #19

            because I'm a good guy :-)

            QString toBitString(const QVariant &v)
            {
                QByteArray bytes = v.toByteArray();
                QString bitString;
            
                QChar Zero('0');
                QChar One('1');
            
                for(int y(0); y <bytes.size(); y++){
                    for(int i(0); i < 8; i++){
                        bool b = (bytes[y] >> i) & 1;
                        bitString.append(b ? One:Zero);
                    }
                }
                return bitString;
            }
            

            Edit:
            Small edit in the code example, v.toByteArray().data() totally unnecessary!


            Be aware of the Qt Code of Conduct, when posting : https://forum.qt.io/topic/113070/qt-code-of-conduct


            Q: What's that?
            A: It's blue light.
            Q: What does it do?
            A: It turns blue.

            H 1 Reply Last reply
            2
            • J.HilkJ J.Hilk

              because I'm a good guy :-)

              QString toBitString(const QVariant &v)
              {
                  QByteArray bytes = v.toByteArray();
                  QString bitString;
              
                  QChar Zero('0');
                  QChar One('1');
              
                  for(int y(0); y <bytes.size(); y++){
                      for(int i(0); i < 8; i++){
                          bool b = (bytes[y] >> i) & 1;
                          bitString.append(b ? One:Zero);
                      }
                  }
                  return bitString;
              }
              

              Edit:
              Small edit in the code example, v.toByteArray().data() totally unnecessary!

              H Offline
              H Offline
              Hollywood33
              wrote on last edited by
              #20

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

              mrjjM Cobra91151C 2 Replies Last reply
              0
              • H Hollywood33

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

                mrjjM Offline
                mrjjM Offline
                mrjj
                Lifetime Qt Champion
                wrote on last edited by
                #21

                @Hollywood33
                Hi
                The docs shows how to use it.
                http://doc.qt.io/qt-5/qfiledialog.html
                It has sample :)

                1 Reply Last reply
                0
                • H Hollywood33

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

                  Cobra91151C Offline
                  Cobra91151C Offline
                  Cobra91151
                  wrote on last edited by
                  #22

                  @Hollywood33

                  Ok, here is the code how I would save it with QFileDialog class using @J-Hilk solution.

                  QString filters = "Text Documents (*.txt);;All files (*.*)";
                  QString filePath = QFileDialog::getSaveFileName(this, "Save binary file", qApp->applicationDirPath() + "/MyFile", filters, nullptr);
                  
                   if (!filePath.isEmpty()) {
                        QFile *myFile = new QFile(filePath);
                        myFile->open(QIODevice::WriteOnly);
                        QTextStream myTextStream(myFile); //QTextStream is used because you want to save it in .txt file
                        myTextStream << toBitString(QString("This is a test!"));
                        myFile->close();
                        myFile->deleteLater();
                        QMessageBox::information(this, "Information", "Binary file is saved!", QMessageBox::Ok);
                   }
                  
                  mrjjM H 2 Replies Last reply
                  2
                  • Cobra91151C Cobra91151

                    @Hollywood33

                    Ok, here is the code how I would save it with QFileDialog class using @J-Hilk solution.

                    QString filters = "Text Documents (*.txt);;All files (*.*)";
                    QString filePath = QFileDialog::getSaveFileName(this, "Save binary file", qApp->applicationDirPath() + "/MyFile", filters, nullptr);
                    
                     if (!filePath.isEmpty()) {
                          QFile *myFile = new QFile(filePath);
                          myFile->open(QIODevice::WriteOnly);
                          QTextStream myTextStream(myFile); //QTextStream is used because you want to save it in .txt file
                          myTextStream << toBitString(QString("This is a test!"));
                          myFile->close();
                          myFile->deleteLater();
                          QMessageBox::information(this, "Information", "Binary file is saved!", QMessageBox::Ok);
                     }
                    
                    mrjjM Offline
                    mrjjM Offline
                    mrjj
                    Lifetime Qt Champion
                    wrote on last edited by
                    #23

                    @Cobra91151
                    Hi
                    Just as a note.
                    There is really no need to new the QFile.
                    QFile myFile;
                    will work just as fine as it has no need to survive the scope/function.
                    but you do delete it so no leak but no real benefit :)

                    Cobra91151C 1 Reply Last reply
                    4
                    • mrjjM mrjj

                      @Cobra91151
                      Hi
                      Just as a note.
                      There is really no need to new the QFile.
                      QFile myFile;
                      will work just as fine as it has no need to survive the scope/function.
                      but you do delete it so no leak but no real benefit :)

                      Cobra91151C Offline
                      Cobra91151C Offline
                      Cobra91151
                      wrote on last edited by
                      #24

                      @mrjj

                      Hi! Yes, you right, in this example better to use QFile myFile on the stack.

                      1 Reply Last reply
                      1
                      • Cobra91151C Cobra91151

                        @Hollywood33

                        Ok, here is the code how I would save it with QFileDialog class using @J-Hilk solution.

                        QString filters = "Text Documents (*.txt);;All files (*.*)";
                        QString filePath = QFileDialog::getSaveFileName(this, "Save binary file", qApp->applicationDirPath() + "/MyFile", filters, nullptr);
                        
                         if (!filePath.isEmpty()) {
                              QFile *myFile = new QFile(filePath);
                              myFile->open(QIODevice::WriteOnly);
                              QTextStream myTextStream(myFile); //QTextStream is used because you want to save it in .txt file
                              myTextStream << toBitString(QString("This is a test!"));
                              myFile->close();
                              myFile->deleteLater();
                              QMessageBox::information(this, "Information", "Binary file is saved!", QMessageBox::Ok);
                         }
                        
                        H Offline
                        H Offline
                        Hollywood33
                        wrote on last edited by
                        #25

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

                        mrjjM Cobra91151C 2 Replies Last reply
                        0
                        • H Hollywood33

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

                          mrjjM Offline
                          mrjjM Offline
                          mrjj
                          Lifetime Qt Champion
                          wrote on last edited by
                          #26

                          @Hollywood33
                          odd it dont know nullptr but you can use 0 (zero) or NULL instead
                          also just remove
                          myTextStream << toBitString(QString("This is a test!"));
                          --->
                          myTextStream << QString("This is a test!");

                          Cobra91151C H 2 Replies Last reply
                          1
                          • mrjjM mrjj

                            @Hollywood33
                            odd it dont know nullptr but you can use 0 (zero) or NULL instead
                            also just remove
                            myTextStream << toBitString(QString("This is a test!"));
                            --->
                            myTextStream << QString("This is a test!");

                            Cobra91151C Offline
                            Cobra91151C Offline
                            Cobra91151
                            wrote on last edited by
                            #27

                            @mrjj

                            The code - myTextStream << QString("This is a test!"); will write only text not bit representation as he wants. So it must be - myTextStream << toBitString(QString("This is a test!"));

                            1 Reply Last reply
                            2
                            • H Hollywood33

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

                              Cobra91151C Offline
                              Cobra91151C Offline
                              Cobra91151
                              wrote on last edited by Cobra91151
                              #28

                              @Hollywood33

                              You must declare tobitstring function in the header (.h file) to use it. + Specify more info about your building process (Qt version, compiler, OS)?

                              Also, instead of nullptr, you can use - Q_NULLPTR macro or add the QString *selectedFilter as the parameter points to in the docs - QFileDialog.

                              H 1 Reply Last reply
                              0
                              • mrjjM mrjj

                                @Hollywood33
                                odd it dont know nullptr but you can use 0 (zero) or NULL instead
                                also just remove
                                myTextStream << toBitString(QString("This is a test!"));
                                --->
                                myTextStream << QString("This is a test!");

                                H Offline
                                H Offline
                                Hollywood33
                                wrote on last edited by
                                #29

                                @mrjj it writes test text, no 0&1s.

                                I was told to read into QByteArray and then send it to stream:
                                QFile f("/Users/ro888.jpg");
                                f.open(QIODevice::ReadOnly);
                                QByteArray ba = f.readAll();
                                stream << ba;

                                So I have to update code in the following example using QByteArray:
                                How to do it?

                                void MainWindow::on_pushButton_3_clicked()
                                {
                                QFile file("/Users/file.bin");
                                if(file.open(QIODevice::WriteOnly))
                                {
                                QDataStream stream(&file);
                                stream. setVersion(QDataStream::Qt_4_2);
                                stream << QPointF(30, 30) << QImage("/Users/ro888.jpg");
                                if(stream.status() != QDataStream::Ok)
                                {
                                qDebug() << "Error";
                                }
                                }
                                file.close();
                                }

                                mrjjM 2 Replies Last reply
                                0
                                • H Hollywood33

                                  @mrjj it writes test text, no 0&1s.

                                  I was told to read into QByteArray and then send it to stream:
                                  QFile f("/Users/ro888.jpg");
                                  f.open(QIODevice::ReadOnly);
                                  QByteArray ba = f.readAll();
                                  stream << ba;

                                  So I have to update code in the following example using QByteArray:
                                  How to do it?

                                  void MainWindow::on_pushButton_3_clicked()
                                  {
                                  QFile file("/Users/file.bin");
                                  if(file.open(QIODevice::WriteOnly))
                                  {
                                  QDataStream stream(&file);
                                  stream. setVersion(QDataStream::Qt_4_2);
                                  stream << QPointF(30, 30) << QImage("/Users/ro888.jpg");
                                  if(stream.status() != QDataStream::Ok)
                                  {
                                  qDebug() << "Error";
                                  }
                                  }
                                  file.close();
                                  }

                                  mrjjM Offline
                                  mrjjM Offline
                                  mrjj
                                  Lifetime Qt Champion
                                  wrote on last edited by
                                  #30

                                  @Hollywood33
                                  Hi
                                  Yes sorry my bad.
                                  I missed that QString toBitString(const QVariant &v) was the function @J-Hilk provided :)
                                  So place
                                  QString toBitString(const QVariant &v) in .h and
                                  the body in the cpp as @Cobra91151 says :)

                                  1 Reply Last reply
                                  3
                                  • H Hollywood33

                                    @mrjj it writes test text, no 0&1s.

                                    I was told to read into QByteArray and then send it to stream:
                                    QFile f("/Users/ro888.jpg");
                                    f.open(QIODevice::ReadOnly);
                                    QByteArray ba = f.readAll();
                                    stream << ba;

                                    So I have to update code in the following example using QByteArray:
                                    How to do it?

                                    void MainWindow::on_pushButton_3_clicked()
                                    {
                                    QFile file("/Users/file.bin");
                                    if(file.open(QIODevice::WriteOnly))
                                    {
                                    QDataStream stream(&file);
                                    stream. setVersion(QDataStream::Qt_4_2);
                                    stream << QPointF(30, 30) << QImage("/Users/ro888.jpg");
                                    if(stream.status() != QDataStream::Ok)
                                    {
                                    qDebug() << "Error";
                                    }
                                    }
                                    file.close();
                                    }

                                    mrjjM Offline
                                    mrjjM Offline
                                    mrjj
                                    Lifetime Qt Champion
                                    wrote on last edited by
                                    #31

                                    @Hollywood33
                                    Hi
                                    Yes using QDataStream will be a binary file.
                                    You paths for the JPG files looks a bit odd but if you are sure they are valid then
                                    should produce a truly binary file :)

                                    1 Reply Last reply
                                    0
                                    • Cobra91151C Cobra91151

                                      @Hollywood33

                                      You must declare tobitstring function in the header (.h file) to use it. + Specify more info about your building process (Qt version, compiler, OS)?

                                      Also, instead of nullptr, you can use - Q_NULLPTR macro or add the QString *selectedFilter as the parameter points to in the docs - QFileDialog.

                                      H Offline
                                      H Offline
                                      Hollywood33
                                      wrote on last edited by
                                      #32

                                      @Cobra91151 I'm on Qt 5.1.0, OS X 10.6.8
                                      I added to header #include "tobitstring.h" - error: no such file or directory

                                      Cobra91151C 1 Reply Last reply
                                      0
                                      • H Hollywood33

                                        @Cobra91151 I'm on Qt 5.1.0, OS X 10.6.8
                                        I added to header #include "tobitstring.h" - error: no such file or directory

                                        Cobra91151C Offline
                                        Cobra91151C Offline
                                        Cobra91151
                                        wrote on last edited by
                                        #33

                                        @Hollywood33 said in Encode/decode to binary file:

                                        @Cobra91151 I'm on Qt 5.1.0, OS X 10.6.8
                                        I added to header #include "tobitstring.h" - error: no such file or directory

                                        You should add the prototype of the function to header file, not include it. Include works for additional files, not for functions!

                                        For example:

                                        test.h file:

                                        public:
                                            explicit Test(QWidget *parent = 0);
                                            QString toBitString(const QVariant &v);
                                            ~Test();
                                        

                                        It contains a constructor, prototype function and destructor.
                                        And then put the body of the function in test.cpp file like this:

                                        QString Test::toBitString(const QVariant &v)
                                        {
                                            QByteArray bytes = v.toByteArray();
                                            QString bitString = "";
                                        
                                            QChar Zero('0');
                                            QChar One('1');
                                        
                                            for (int y(0); y <bytes.size(); y++){
                                                for (int i(0); i < 8; i++){
                                                    bool b = (bytes[y] >> i) & 1;
                                                    bitString.append(b ? One:Zero);
                                                }
                                            }
                                        
                                            return bitString;
                                        }
                                        

                                        Your class is - MainWindow, Test is just for testing purposes.

                                        J.HilkJ 1 Reply Last reply
                                        3
                                        • Cobra91151C Cobra91151

                                          @Hollywood33 said in Encode/decode to binary file:

                                          @Cobra91151 I'm on Qt 5.1.0, OS X 10.6.8
                                          I added to header #include "tobitstring.h" - error: no such file or directory

                                          You should add the prototype of the function to header file, not include it. Include works for additional files, not for functions!

                                          For example:

                                          test.h file:

                                          public:
                                              explicit Test(QWidget *parent = 0);
                                              QString toBitString(const QVariant &v);
                                              ~Test();
                                          

                                          It contains a constructor, prototype function and destructor.
                                          And then put the body of the function in test.cpp file like this:

                                          QString Test::toBitString(const QVariant &v)
                                          {
                                              QByteArray bytes = v.toByteArray();
                                              QString bitString = "";
                                          
                                              QChar Zero('0');
                                              QChar One('1');
                                          
                                              for (int y(0); y <bytes.size(); y++){
                                                  for (int i(0); i < 8; i++){
                                                      bool b = (bytes[y] >> i) & 1;
                                                      bitString.append(b ? One:Zero);
                                                  }
                                              }
                                          
                                              return bitString;
                                          }
                                          

                                          Your class is - MainWindow, Test is just for testing purposes.

                                          J.HilkJ Offline
                                          J.HilkJ Offline
                                          J.Hilk
                                          Moderators
                                          wrote on last edited by
                                          #34

                                          @Cobra91151 I have to compliment your patience. *Thumbs up*


                                          Be aware of the Qt Code of Conduct, when posting : https://forum.qt.io/topic/113070/qt-code-of-conduct


                                          Q: What's that?
                                          A: It's blue light.
                                          Q: What does it do?
                                          A: It turns blue.

                                          1 Reply Last reply
                                          3

                                          • Login

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