Russian Qt Forum

Qt => Общие вопросы => Тема начата: giker от Февраль 09, 2011, 08:59



Название: Сжатие строки с помощью qCompres
Отправлено: giker от Февраль 09, 2011, 08:59
Всем доброго дня. Нужно сжать сроку с помощю qCompress. Пишу такой код:
Код:
QByteArray asc = string.toAscii();
QByteArray compressed = qCompress(asc, 9);
QString tmp = QString(compressed);

но tmp = "".
Объясните пожалуйста почему? Насколько я понимаю там должна быть последовательность каких-то символов, которые получены в результате сжатия строки. Само-собой string != "".
Как правильно сжать строку?
Спасибо.


Название: Re: Сжатие строки с помощью qCompres
Отправлено: Странник от Февраль 09, 2011, 09:17
ты все сжимаешь правильно. но есть одно но - после сжатия ты получаешь бинарные, а не текстовые данные, поэтому нельзя просто засунуть их в QString. используй QByteArray для хранения и передачи сжатых данных, а в QString их преобразовывай только после декомпрессии. если же есть необходимость передачи бинарных данных в текстовом виде (например, XML) - можно использовать такой вариант:
Код:
QString tmp = QString(qCompress(string.toAscii(), 9).toBase64()); //сжатая строка в кодировке Base64

string = QString(qUncompress(QByteArray::fromBase64(tmp.toLatin1()))); //исходная строка


Название: Re: Сжатие строки с помощью qCompres
Отправлено: giker от Февраль 09, 2011, 10:28
Спасибо Странник, то что нужно  :)


Название: Re: Сжатие строки с помощью qCompres
Отправлено: kuzulis от Февраль 09, 2011, 11:40
Цитата: giker
но tmp = "".
[режим разжевывания азов]
Как уже было сказано выше - это случилось потому, что значение первого байта в сжатых данных скорее всего получилось == 0, поэтому при добавлении в QString этого массива (с первым нулём) - вышел размер строки  == 0.
А всё потому, что строки заканчиваются '\0' !!!
Вот если бы в сжатом массиве нулю равнялся второй байт - то при добавлении в QString - оно бы показало длину строки в 1 байт!  ;)
[/режим разжевывания азов]