Предыдущая тема :: Следующая тема |
Автор |
Сообщение |
stasik2002
Зарегистрирован: 16.11.2006 Сообщения: 4
|
Добавлено: Чт Ноя 16 2006 22:48 Заголовок сообщения: Упаковка AnsiString в C++ Builder |
|
|
Как упаковать одну AnsiString в другую AnsiString меньшего размера?
Задача: есть некая AnsiString (содержимое - xml, ~100-10000Кб), ее надо упаковать в другую AnsiString (для последующей отправки по TCP/IP через компоненты IPWorks/SSL). Zip-компоненты (напр. AbaleZip) пакуют примерно в 10 и более раз. Но как преобразовать результат упаковки Variant Byte Array в AnsiString? У меня ничего не получилось. Вроде как есть Xceed Libraries, которые делают конвертацию ToString() и FromString(), но у меня опять ничего не получилось - эти функции возвращают строки нулевой длины (может я неверно работаю с указателями?). Мои запросы по почте в Xceed игнорируются.
Наверняка должны быть готовые решения для такого типа задач.
В итоге мне нужно две функции:
AnsiString pack(AnsiString s) и AnsiString unpack(AnsiString s)
Заранее признателен и благодарен.
Стас. |
|
Вернуться к началу |
|
![](templates/subSilver/images/spacer.gif) |
Mytilus Galloprovincialis
Зарегистрирован: 30.08.2005 Сообщения: 358 Откуда: откуда все люди родятся
|
Добавлено: Пн Ноя 20 2006 02:28 Заголовок сообщения: |
|
|
Подробнее, плз. Что значит "упаковать AnsiString в AnsiString"? |
|
Вернуться к началу |
|
![](templates/subSilver/images/spacer.gif) |
stasik2002
Зарегистрирован: 16.11.2006 Сообщения: 4
|
Добавлено: Пн Ноя 20 2006 18:07 Заголовок сообщения: |
|
|
Цитата: | Подробнее, плз. Что значит "упаковать AnsiString в AnsiString"? |
Исходная строка AnsiString довольно большая для отправки по TCP/IP (от сотен до тысяч Кб). Строка "зипуется" очень хорошо, получается где-то 5-10% от первоначального размера. Но результат - это бинарный массив, с которым работать крайне неудобно. Хочется найти способ архивирования и деархивирования AnsiString, который дает в результате также AnsiString (без заморочек с бинарными массивами). |
|
Вернуться к началу |
|
![](templates/subSilver/images/spacer.gif) |
sniper::p
Зарегистрирован: 04.10.2005 Сообщения: 237 Откуда: rus/73
|
Добавлено: Пн Ноя 20 2006 23:23 Заголовок сообщения: |
|
|
А что значит "бинарный массив"? Если вы имеете ввиду char* или void*, то можно эту же строку преобразовать и в AnsiString. Данные для распаковки брать AnsiString.c_str() Вот и все _________________ Нет предела совершенствованию |
|
Вернуться к началу |
|
![](templates/subSilver/images/spacer.gif) |
Mytilus Galloprovincialis
Зарегистрирован: 30.08.2005 Сообщения: 358 Откуда: откуда все люди родятся
|
Добавлено: Вт Ноя 21 2006 02:55 Заголовок сообщения: |
|
|
Я не работал ни с AbaleZip, ни с какими-либо другими зипами. В свое время я сам писал и реализовывал алгоритм архивации-деархивации данных для отправки по COM-порту на специфическое устройство и обратно. Тогда я искал готовые компоненты архивации, пока не наткнулся на статью одного программера, писавшего о ускорении передачи данных через коммутированный доступ в Интернет за счет архивирования. Там он высказал такую вещь, что, мол, рассматривались у них в фирме готовые продукты сторонних разработчиков по сжатию данных, но все они не подошли из-за ненадежности (какой именно - не описывалось). В результате они пришли к выводу, что надо делать свой движок сжатия. Прочитав это, я решил тоже написать свой архиватор.
На самом деле, это не так уж и сложно. Благо в статье того прогера были описаны принципы работы архиватора в достаточном количестве.
Но если не хочешь заморачиваться, то в Нете можно найти кучу готовых классов и функций.
Хотя, непонятно. Если этот твой AbaleZip может сжимать данные, неужели в нем не предусмотрена их деархивация! |
|
Вернуться к началу |
|
![](templates/subSilver/images/spacer.gif) |
stasik2002
Зарегистрирован: 16.11.2006 Сообщения: 4
|
Добавлено: Вт Ноя 21 2006 19:16 Заголовок сообщения: |
|
|
Отвечаю сразу всем:
AbaleZip может как сжимать данные, так и распаковывать. Чтобы он зазиповал строку, надо ему её дать как BSTR, а он выплюнет Variant как variant array of bytes. Для раззиповки он требует variant array of bytes и выдает результат также как variant array of bytes. Вопрос в том, как сделать преобазование variant array of bytes в AnsiString и обратно. В тупую не получается - дает строку из 4 пробелов.
Разумеется, я копался в Нете и нашел компоненты для архивации, но, по-видимому, мне не хватает компетенции, чтобы правильно конвертировать variant array of bytes (туда и обратно). |
|
Вернуться к началу |
|
![](templates/subSilver/images/spacer.gif) |
Mytilus Galloprovincialis
Зарегистрирован: 30.08.2005 Сообщения: 358 Откуда: откуда все люди родятся
|
Добавлено: Вт Ноя 21 2006 23:32 Заголовок сообщения: |
|
|
Скорее всего, тебе возвращается не строка, а указатель на нее. |
|
Вернуться к началу |
|
![](templates/subSilver/images/spacer.gif) |
stasik2002
Зарегистрирован: 16.11.2006 Сообщения: 4
|
Добавлено: Чт Ноя 23 2006 22:26 Заголовок сообщения: |
|
|
Цитата: | Скорее всего, тебе возвращается не строка, а указатель на нее. |
Возможно. У меня вся схема "исходная строка->упакованный массив->упакованная строка->опять упакованный массив->исходная строка" работает. И работает в виде "AnsiString->TVariant->wchar_t*->TVariant->AnsiString" (размер TVariant на порядок меньше исходной AnsiString, я проверял). И всё бы хорошо, но я не могу сделать преобразование wchar_t* в AnsiString.
Пусть есть переменная а типа wchar_t*, и нужно ее преобразовать в переменную b типа AnsiString (обратное преобразование также необходимо). Преобразование AnsiString(а) дает пустую строку, преобразование AnsiString(*а) дает строку "0". Что делать? Мне еще известно, что реальный тип переменной а - это BSTR.
Помогите дауну! |
|
Вернуться к началу |
|
![](templates/subSilver/images/spacer.gif) |
Mytilus Galloprovincialis
Зарегистрирован: 30.08.2005 Сообщения: 358 Откуда: откуда все люди родятся
|
Добавлено: Пт Ноя 24 2006 12:58 Заголовок сообщения: |
|
|
b = WideCharToString(a); |
|
Вернуться к началу |
|
![](templates/subSilver/images/spacer.gif) |
|