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. [Split] QString/QByteArray conversion problems
Forum Updated to NodeBB v4.3 + New Features

[Split] QString/QByteArray conversion problems

Scheduled Pinned Locked Moved General and Desktop
28 Posts 3 Posters 20.5k 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.
  • S Offline
    S Offline
    swhweng
    wrote on last edited by
    #10

    Very interesting.
    Yes it can happen ( I do not understand deeply now but I think...), but it can happen when you convert to bytes, make xor, convert to string, store and convert vice versa. It happens when you put xored bytes coded of utf to QString for some of cases not always, am I right?

    Edit:
    What 8 bit character codec to use that has characters “coded” for any 0 to 2^8 – 1 numbers?

    Edit: merged posts. Please add to your previous comment if you hit the Post button before thinking if this is really all you wanted to say; Andre

    1 Reply Last reply
    0
    • A Offline
      A Offline
      andre
      wrote on last edited by
      #11

      For encryption, it really doesn't matter. As long as you are consistent. I would probably use UTF-8. After XOR-ing, you end up with a byte array containing binairy data, not a string (as Volker has tried to point out to you repeatingly). You could use QByteArray::toBase64 to create a QString you can store in a text file. Then, you can do the reverse on your way back: read in the base64 encoded byte array, XOR with your secret key, and then create a QString with fromUtf8 based on that decoded byte array.

      1 Reply Last reply
      0
      • S Offline
        S Offline
        swhweng
        wrote on last edited by
        #12

        Yes Yes Yes
        Thank you
        If I use QByteArray::toBase64 what kind of QString then?

        Edit:
        I am looking for simplest way to encrypt any characters set
        Perhaps to use QCryptographicHash?

        Edit: merged two consecutive messages again. Please do that yourself next time; Andre

        1 Reply Last reply
        0
        • A Offline
          A Offline
          andre
          wrote on last edited by
          #13

          Since base64 by definition only uses ASCII characters, any encoding that has those at the right places will do. UTF-8 is one of them, but of course QString::fromAscii() would do better, I think.

          Edit: QCryptographicHash does, as the name implies, hashing. That is not the same as encryption. Hashing is (in theory) a one-way, non reversible operation, encryption a two-way operation (that is, you can reverse it). You might look into QCA.

          1 Reply Last reply
          0
          • S Offline
            S Offline
            swhweng
            wrote on last edited by
            #14

            After I checked and thought here it is:

            There is a need to convert each character to 8 bit such way that any 8 bit number has it's representation in characters - one to one from 0000 0000 to 1111 1111 and then it is Ok to make xor and vice versa?

            So what coding system ( standard ) provides 8 bit number one to one to characted mapping?
            ASCII?

            1 Reply Last reply
            0
            • S Offline
              S Offline
              swhweng
              wrote on last edited by
              #15

              if I use QByteArray QCryptographicHash::hash ( const QByteArray & data, Algorithm method )
              and then should I put the QByteArray to text file ( if I need for example to store encrypted data on hdd ) as QDataStream or can I use QByteArray::toBase64 ? What codec Qt supports crossplatform that provides one - to - one coding of characters to bytes ( 8 bit numbers ) ?
              Pavel
              14.03.2011

              1 Reply Last reply
              0
              • S Offline
                S Offline
                swhweng
                wrote on last edited by
                #16

                This also can help to any who is interesting in fast and reliable encryption:

                http://wiki.forum.nokia.com/index.php/How_to_Encrypt_a_text_using_QCryptographicHash_in_Qt_for_Symbian

                1 Reply Last reply
                0
                • S Offline
                  S Offline
                  swhweng
                  wrote on last edited by
                  #17

                  because ASCII has no period and UTF8 does have?

                  1 Reply Last reply
                  0
                  • A Offline
                    A Offline
                    andre
                    wrote on last edited by
                    #18

                    I am sorry, but: you really don't get it, do you?

                    You still keep on posting multiple messages in a row, instead of adding to your previous messages with the edit link on the right side of your last message

                    I already explained to you that hashing is not the same as encryption, no matter what that misguided wiki entry tells you

                    I already explained that the character encoding you use for your string is inconsequential

                    QByteArray already can be thought off as an array of 8-bit (yes, that is a byte in the x86 world) characters. Do your xor magic on that.

                    1 Reply Last reply
                    0
                    • S Offline
                      S Offline
                      swhweng
                      wrote on last edited by
                      #19

                      Sorry, ASCII is one to one character to 8 bit conversion in all 0 - 255 range?
                      I am not sure
                      I need Qt supported codec that converts characters one to one to 8 bit number in 0 -255 range, another worlds each 8 bit number in byte array has it's unique character.
                      What is the codec?

                      1 Reply Last reply
                      0
                      • S Offline
                        S Offline
                        swhweng
                        wrote on last edited by
                        #20

                        Andre I understand - Ok I won't post multiple but by using edit.
                        Ok Thanks a Lot. Using hash can I make "unhash" with the same key? How can I get unhashing one - to -one?

                        1 Reply Last reply
                        0
                        • A Offline
                          A Offline
                          andre
                          wrote on last edited by
                          #21

                          [quote author="Pavel Mazniker" date="1300124063"]Andre I understand - Ok I won't post multiple but by using edit.[/quote]

                          You just did.

                          1 Reply Last reply
                          0
                          • G Offline
                            G Offline
                            goetz
                            wrote on last edited by
                            #22

                            [quote author="Pavel Mazniker" date="1300122778"]What codec Qt supports crossplatform that provides one - to - one coding of characters to bytes ( 8 bit numbers ) ?[/quote]

                            The whole thing about codecs is to map all the big bunch of non-ASCII characters into some 8-bit representation. This can reduce the mappable characters (like in ISO-8859-1) or it can lead to a representation consisting of multiple 8-bit bytes (like in UTF-8).

                            All conversion methods that return QByteArray give you an array of 8bit bits.

                            http://www.catb.org/~esr/faqs/smart-questions.html

                            1 Reply Last reply
                            0
                            • S Offline
                              S Offline
                              swhweng
                              wrote on last edited by
                              #23

                              [quote author="Volker" date="1300125063"]
                              [quote author="Pavel Mazniker" date="1300122778"]What codec Qt supports crossplatform that provides one - to - one coding of characters to bytes ( 8 bit numbers ) ?[/quote]

                              The whole thing about codecs is to map all the big bunch of non-ASCII characters into some 8-bit representation. This can reduce the mappable characters (like in ISO-8859-1) or it can lead to a representation consisting of multiple 8-bit bytes (like in UTF-8).

                              All conversion methods that return QByteArray give you an array of 8bit bits.[/quote]

                              Hi
                              Thank you very much for your help.
                              Your explanations here at the forum really helped me.
                              It seems this time I fixed the problem finally - encryption/decryption works for letters,numbers and @ sign,

                              • I've checked for some inputs and it is ok and also theoretically shoud not be any problem( not for any possible character ).So as to be sure 100% one should understand
                                how Ascii,Base64 map char to byte.
                                I encrypt by manipulating bytes of byte array: QString someString.toAscii(),
                                after that I convert it .toBase64() and save it using QDataStream to .dat file.
                                When I decrypt I open .dat file with QDataStream,convert readed data from Base64 using QByteArray::fromBase64()
                                and make byte manipulations needed for decryption on the byte array decoded from file.
                                Pavel
                              1 Reply Last reply
                              0
                              • G Offline
                                G Offline
                                goetz
                                wrote on last edited by
                                #24

                                Sounds reasonable.

                                One hint: If you use QDataStream you can save yourself the base64 encoding/decoding step, but write and read a QByteArray directly.

                                Also I would convert the original string to utf8(), as toAscii() and toLatin1() are conversions that can loose characters (ie. it is a conversion that is not reversible).

                                Just try:

                                @
                                // a cyrillic char and the euro sign
                                QString t = QString::fromUtf8("д€");
                                qDebug() << "ascii" << t.toAscii().toHex();
                                qDebug() << "latin1" << t.toLatin1().toHex();
                                qDebug() << "utf8" << t.toUtf8().toHex();
                                @

                                the output is

                                @
                                ascii "3f3f"
                                latin1 "3f3f"
                                utf8 "d0b4e282ac"
                                @

                                Hex code 3f is question mark; so both chars translate to '?' when using toAscii(), and you will get back to question marks, when re-transforming the bytes to a string.

                                And please, please stop thinking in characters when you called any of the toXXX() methods of QString. What you then have is just a bunch of bytes. Treat them as bytes, not as chars!

                                http://www.catb.org/~esr/faqs/smart-questions.html

                                1 Reply Last reply
                                0
                                • S Offline
                                  S Offline
                                  swhweng
                                  wrote on last edited by
                                  #25

                                  I understand UTF8 provides support for wider characters set that Ascii
                                  So I save QString converted to UTF8 code as byte array ( manipulated ) but when I decrypt I can loose characters once UTF8 is not (one) -to -(one) (character) -to - (8bit number) mapping?

                                  1 Reply Last reply
                                  0
                                  • A Offline
                                    A Offline
                                    andre
                                    wrote on last edited by
                                    #26

                                    [quote author="Pavel Mazniker" date="1300196573"]I understand UTF8 provides support for wider characters set that Ascii
                                    So I save QString converted to UTF8 code as byte array ( manipulated ) but when I decrypt I can loose characters once UTF8 is not (one) -to -(one) (character) -to - (8bit number) mapping?[/quote]

                                    No. You can just re-create a QString from your QByteArray containing UTF-8. The operation is completely lossless.

                                    1 Reply Last reply
                                    0
                                    • G Offline
                                      G Offline
                                      goetz
                                      wrote on last edited by
                                      #27

                                      The following snippet is guaranteed to work with any value for x (ie. x and y are always equal in the end):

                                      @
                                      String x = "some fancy string";
                                      QByteArray ba = x.toUtf8();
                                      String y = QString::fromUtf8(ba);
                                      if(x == y)
                                      qDebug() << "strings are equal";
                                      @

                                      If you replace toUtf8() with toAscii() or toLatin1() and replace fromUtf8() with fromAscii() or fromLatin1(), it is not guaranteed that x and y are equal in the end.

                                      For some further explanations, please ask Google or your favorite search engine on the topic (text encoding, charsets, etc). That's beyond the topic for a Qt forum.

                                      http://www.catb.org/~esr/faqs/smart-questions.html

                                      1 Reply Last reply
                                      0
                                      • A Offline
                                        A Offline
                                        andre
                                        wrote on last edited by
                                        #28

                                        @Pavel:

                                        Perhaps this "Wiki article":http://developer.qt.nokia.com/wiki/Simple_encryption I just published is of use to you? It presents a class I wrote for simple encryption and decryption of QStrings and QByteArrays with a symmetric 64 bit key.

                                        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