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.
  • mrjjM Offline
    mrjjM Offline
    mrjj
    Lifetime Qt Champion
    wrote on 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 :)

    jsulmJ 1 Reply Last reply
    4
    • mrjjM mrjj

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

      jsulmJ Offline
      jsulmJ Offline
      jsulm
      Lifetime Qt Champion
      wrote on 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
      • 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 Online
                J.HilkJ Online
                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

                                          • Login

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