Logo Море(!) аналитической информации!
IT-консалтинг Software Engineering Программирование СУБД Безопасность Internet Сети Операционные системы Hardware
Архив форумов ЦИТФорума
Море(!) вопросов - Море(!) ответов
 
 FAQFAQ   ПоискПоиск   ПользователиПользователи   ГруппыГруппы   РегистрацияРегистрация 
 ПрофильПрофиль   Войти и проверить личные сообщенияВойти и проверить личные сообщения   ВходВход 
Как правильно задавать вопросы

Упаковка AnsiString в C++ Builder

 
Перейти:  
Этот форум закрыт, вы не можете писать новые сообщения и редактировать старые.   Эта тема закрыта, вы не можете писать ответы и редактировать сообщения.    Список форумов Архив форумов ЦИТФорума -> Программирование
Предыдущая тема :: Следующая тема  
Автор Сообщение
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)

Заранее признателен и благодарен.
Стас.
Вернуться к началу
Посмотреть профиль Отправить личное сообщение
Mytilus Galloprovincialis



Зарегистрирован: 30.08.2005
Сообщения: 358
Откуда: откуда все люди родятся

СообщениеДобавлено: Пн Ноя 20 2006 02:28    Заголовок сообщения: Ответить с цитатой

Подробнее, плз. Что значит "упаковать AnsiString в AnsiString"?
Вернуться к началу
Посмотреть профиль Отправить личное сообщение
stasik2002



Зарегистрирован: 16.11.2006
Сообщения: 4

СообщениеДобавлено: Пн Ноя 20 2006 18:07    Заголовок сообщения: Ответить с цитатой

Цитата:
Подробнее, плз. Что значит "упаковать AnsiString в AnsiString"?


Исходная строка AnsiString довольно большая для отправки по TCP/IP (от сотен до тысяч Кб). Строка "зипуется" очень хорошо, получается где-то 5-10% от первоначального размера. Но результат - это бинарный массив, с которым работать крайне неудобно. Хочется найти способ архивирования и деархивирования AnsiString, который дает в результате также AnsiString (без заморочек с бинарными массивами).
Вернуться к началу
Посмотреть профиль Отправить личное сообщение
sniper::p



Зарегистрирован: 04.10.2005
Сообщения: 237
Откуда: rus/73

СообщениеДобавлено: Пн Ноя 20 2006 23:23    Заголовок сообщения: Ответить с цитатой

А что значит "бинарный массив"? Если вы имеете ввиду char* или void*, то можно эту же строку преобразовать и в AnsiString. Данные для распаковки брать AnsiString.c_str() Вот и все
_________________
Нет предела совершенствованию
Вернуться к началу
Посмотреть профиль Отправить личное сообщение Отправить e-mail
Mytilus Galloprovincialis



Зарегистрирован: 30.08.2005
Сообщения: 358
Откуда: откуда все люди родятся

СообщениеДобавлено: Вт Ноя 21 2006 02:55    Заголовок сообщения: Ответить с цитатой

Я не работал ни с AbaleZip, ни с какими-либо другими зипами. В свое время я сам писал и реализовывал алгоритм архивации-деархивации данных для отправки по COM-порту на специфическое устройство и обратно. Тогда я искал готовые компоненты архивации, пока не наткнулся на статью одного программера, писавшего о ускорении передачи данных через коммутированный доступ в Интернет за счет архивирования. Там он высказал такую вещь, что, мол, рассматривались у них в фирме готовые продукты сторонних разработчиков по сжатию данных, но все они не подошли из-за ненадежности (какой именно - не описывалось). В результате они пришли к выводу, что надо делать свой движок сжатия. Прочитав это, я решил тоже написать свой архиватор.
На самом деле, это не так уж и сложно. Благо в статье того прогера были описаны принципы работы архиватора в достаточном количестве.

Но если не хочешь заморачиваться, то в Нете можно найти кучу готовых классов и функций.

Хотя, непонятно. Если этот твой AbaleZip может сжимать данные, неужели в нем не предусмотрена их деархивация!
Вернуться к началу
Посмотреть профиль Отправить личное сообщение
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 (туда и обратно).
Вернуться к началу
Посмотреть профиль Отправить личное сообщение
Mytilus Galloprovincialis



Зарегистрирован: 30.08.2005
Сообщения: 358
Откуда: откуда все люди родятся

СообщениеДобавлено: Вт Ноя 21 2006 23:32    Заголовок сообщения: Ответить с цитатой

Скорее всего, тебе возвращается не строка, а указатель на нее.
Вернуться к началу
Посмотреть профиль Отправить личное сообщение
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.

Помогите дауну!
Вернуться к началу
Посмотреть профиль Отправить личное сообщение
Mytilus Galloprovincialis



Зарегистрирован: 30.08.2005
Сообщения: 358
Откуда: откуда все люди родятся

СообщениеДобавлено: Пт Ноя 24 2006 12:58    Заголовок сообщения: Ответить с цитатой

b = WideCharToString(a);
Вернуться к началу
Посмотреть профиль Отправить личное сообщение
Показать сообщения:   
Этот форум закрыт, вы не можете писать новые сообщения и редактировать старые.   Эта тема закрыта, вы не можете писать ответы и редактировать сообщения.    Список форумов Архив форумов ЦИТФорума -> Программирование Часовой пояс: GMT + 3
Страница 1 из 1

 
Перейти:  
Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете голосовать в опросах


Powered by phpBB © 2001, 2002 phpBB Group
Русская поддержка phpBB

 

IT-консалтинг Software Engineering Программирование СУБД Безопасность Internet Сети Операционные системы Hardware

Информация для рекламодателей PR-акции, размещение рекламы — adv@citforum.ru,
тел. +7 495 6608306, ICQ 232284597
Пресс-релизы — pr@citforum.ru
Послать комментарий
Информация для авторов
This Web server launched on February 24, 1997
Copyright © 1997-2000 CIT, © 2001-2006 CIT Forum
Внимание! Любой из материалов, опубликованных на этом сервере, не может быть воспроизведен в какой бы то ни было форме и какими бы то ни было средствами без письменного разрешения владельцев авторских прав. Подробнее...