[Split] QString/QByteArray conversion problems
-
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
-
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.
-
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? -
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 -
This also can help to any who is interesting in fast and reliable encryption:
-
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.
-
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? -
[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 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
- 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
-
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!
-
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 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.
-
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.