Распаковка gzip строки #765672


#0 by Crush
От сервера получаю строку, запакованную gzip. Как распаковать?. Вместе со строкой есть еще и stream в виде ComSafeArray, где каждый элемент - это аскии-код символа той же самой строки. Пробовал через base64 в файл записать, но всё равно фигня какая то получается. Поиск только php-функции для распаковки предлагает.
#1 by Crush
1С:Предприятие 8.3 (8.3.7.1873)
#2 by sash-ml
запиши в текстовый файл с расширением zip. открой проводником. при открытии такого архива в нем будет один файл без расширения совпадающий с именем архива. Если ок. то дальше ЧтениеZipФайла
#3 by Crush
Неполучится. У файла зип-архива есть заголовки и прочее. А уменя только упакованная строка. На php это делается так: string gzencode ( string $data [, int $level = -1 [, int $encoding_mode = FORCE_GZIP ]] ) В браузерах встроенные энкодеры. В cURL-е тоже есть распаковщик. А в 1С я хз как реализовать. Алгоритм распаковки самому писать совсем не хочется.
#4 by sash-ml
получится, если нет заголовков, то там будет один файл без расширения совпадающий с именем архива
#5 by Crush
Блииин!!! Ты прав!!!! Спасибо!!! Вчера пробовал, не взлетело. Сейчас попробовал - получилось. Но, всё же вопрос остаётся. Т.к. распаковать как то можно без использования файловой системы.
#6 by sash-ml
варианты еще такие, вывести на форму поле ХТМЛ документа и попробовать там через JS Найти СОМобъект который работает с гЗИП например  gzip.DeflateStringENC gzip.InflateStringENC
#7 by Crush
Форма - не вариант. Распаковка на сервере в регламентном задании будет. Я пока Compression API ковыряю.
#8 by sash-ml
как строку получаешь?
#9 by Crush
WinHttp.ResponseText //WinHttp = Новый COMОбъект("WinHttp.WinHttpRequest.5.1")
#10 by sash-ml
а если в браузере открыть, строка тоже запакована?
#11 by Crush
Да
#12 by Crush
Косякус. 1С-овский ЧтениеZipФайла не может работать с этим архивом, а far  и 7-zip могут.
#13 by sash-ml
печаль, тогда нужно что-то вроде ЗапуститьПриложение("unzip myfile",каталог), но это уже костыль на костыле.
#14 by Лефмихалыч
а он аргументирует чем-то, когда не может?
#15 by Serginio1
#16 by Serginio1
Тебе подойдет GetStreamAsync
#17 by oleg_km
Да, один из моментов использования .НЕТ. Вот код на 1С:
#18 by Crush
Ругается на неверный формат файла Ага. Причём только через ЗапуститьПриложение и получается. А через Shell нивкакую     WshShell = Новый COMObject("WScript.Shell");     Сообщить(WshShell.Run("""C:Program Files7-Zip7z.exe"" x D: mepgzip1 -so>d:3",0,1));
#19 by Serginio1
Можешь скинуть ссылку на ресурс? Посмотрю и может другим польза будет. И пример то, чего вытаскиваешь.
#20 by kirillkr
, Олег, а что из себя представляют функции ПолучитьТипыДляФайлов, СоздатьОбъект и ПолучитьТип
#21 by Crush
Какой ресурс? Пример - это строка сжатая gzip. Нашел пока убогий вариант средствами WScript.Shell 1. Создаю bat-ник со строкой распаковки "C:Program Files7-Zip7z.exe" x d:1.zip -so>d:1.txt 2. Запускаю батник WshShell.Run("d:1.bat",0,1); 7zip в этом случае не ругается и трабатывает как надо. Распакованный текст получаю. Окошко консоли не появляется. Но, блин, жуть как криво получается:(
#22 by Serginio1
Любой ресурс который возвращает сжатую строку Смотри Это обертка над методами NetObjectToIDispatch45 врап=новый COMОбъект("NetObjectToIDispatch45");
#23 by miliko
понятно ... сколько будет 2*2, без гугла не обойтись )
#24 by Crush
Нашел клёвую штуку comобъект("Chilkat.Gzip"), но она триальная на 30 дней, а дальше 149$. Ссылку на конкретный ресурс не могу дать, а других не знаю:( system.io.compression.gzipstream - эта штука - это то, что надо, но с обёрткой у меня пока туго. Видимо придётся завтра курить эту тему.
#25 by Crush
+ Оставлю это здесь, мож кому интересно будет. Но дорого!
#26 by Serginio1
А чем тебе 17 не подходит? Причем бесплатно.
#27 by Serginio1
Еще раз дай ресурс я протестирую и выложу с использованием HTTPClient итд. Там 3-5 строк кода.
#28 by Garykom
еще можно взять код на C из и наваять на 1С свой распаковщик
#29 by Serginio1
Кстати можно автоматически разархивировать HttpClientHandler handler = new HttpClientHandler {     AutomaticDecompression = DecompressionMethods.GZip | DecompressionMethods.Deflate }; using (var client = new HttpClient(handler)) }
#30 by Serginio1
По русски это выглядит так
#31 by Serginio1
uriSources подставь свой. По поводу OR то напишу. Но можно использовать варианты Как здесь или Напишу во врапере OR а то оченьчасто встречается
#32 by Serginio1
Добавил в новой сборке метод OR
#33 by Garykom
крут, теперь "составные перечисления" можно
#34 by Serginio1
А это еще чё такое?
#35 by Serginio1
#36 by Garykom
в смысле сделать когда шрифт одновременно жирный, курсивный и подчеркнутый
#37 by Serginio1
У него FlagsAttribute Можешь применять
#38 by Serginio1
#39 by Crush
Что то не понимаю как переделать код под System.IO.Compression.GZipStream И у меня пустой Ком-объект на выходе
#40 by Crush
В мсдн говорят, что сборка в system.dll Хотя есть отдельная библиотека System.IO.Compression.dll, но с ней тоже пустой ком-объект.
#41 by Garykom
Это не тип а класс юзай "Врап.СоздатьОбъект"
#42 by Garykom
+ если в коде на C# стоит "new" то класс это
#43 by Crush
А как правильно параметр передать? Compression=Врап.СоздатьОбъект("System.IO.Compression.GZipStream[ГзипСтрока]"); по причине: Произошла исключительная ситуация (NetObjetToIDispatch45):  неверный тип System.IO.Compression.GZipStream[ГзипСтрока] Compression=Врап.СоздатьОбъект("System.IO.Compression.GZipStream"); по причине: Произошла исключительная ситуация (mscorlib): Конструктор для типа "System.IO.Compression.GZipStream" не найден.
#44 by Garykom
через "," уже параметры передаешь поток нужно передать и "тип" CompressionMode.Decompress
#45 by Garykom
+ лучше попроси
#46 by Crush
по причине: Произошла исключительная ситуация (mscorlib): Невозможно загрузить файл или сборку "CompressionModeDecompress)" или один из зависимых от них компонентов. Неправильный указатель (Исключение из HRESULT: 0x80004003 (E_POINTER))
#47 by Crush
И так не прёт:( Какой правильный синтаксис?         хз2 = врап.СоздатьОбъект("System.IO.Compression.GZipStream",ГзипСтрока, CompressionModeDecompress);
#48 by Garykom
правильно, только "ГзипСтрока" - нужно на основе строки создать поток(stream) и "CompressionModeDecompress" - вот это ПолучитьТип
#49 by Garykom
+ короче без знаний хотя бы начальных C# это унреал ))
#50 by Crush
по причине: Произошла исключительная ситуация (NetObjetToIDispatch45): Ссылка на объект не указывает на экземпляр объекта.
#51 by oleg_km
#52 by Crush
по причине: Произошла исключительная ситуация (mscorlib): Конструктор для типа "System.IO.Compression.GZipStream" не найден.
#53 by Crush
по причине: Произошла исключительная ситуация (NetObjetToIDispatch45):  неверный тип System.IO.Compression.GZipStream
#54 by Crush
Сдвинулся с мёртвой точки. Но пока без результата
#55 by Crush
+ На этом пока и закончу. Ком-объект есть, правда по свойствам и не очень похожий на GZipStream, но имя и пространство имён правильные. Осталось придумать как туда пихнуть поток и получить исходящий распакованный поток. Вот я думаю, может поток в данном случае нужно подругому формировать. Средствами тогоже фреймворка, а не COMОбъект("ADODB.Stream")?
#56 by Garykom
#57 by Serginio1
Во первых что ты собрался разархивировать? Зачем тебе ADODB.Stream если есть FileStream Завтра напишу. А 30 пробовал?
#58 by Serginio1
Если тебе byte[] то Если файл то
#59 by Garykom
ТСу практически бесполезны эти ссылки, а когда выучит C# и .Net сам все что нужно найдет из строки в строку ему нужно, далее сам сделает что надо
#60 by Serginio1
меньше параметров. Понятно. Завтра напишу.
#61 by Serginio1
Блин разбудили. Вот алгоритм сжатия строки и результат в Base64 и обратный процесс стр = "Строка для теста компрессии декомпрессии";
#62 by Serginio1
61+ Посмотри 30,32 там автоматическая разархивация при получении ответа запроса
#63 by Serginio1
62+
#64 by Serginio1
При чем если использовать И приходит ответ HTTP/1.1 200 OK Кстати общий размер раскодированной строки 87 624 Так, что можно использовать на тонких каналах
#65 by Crush
пробовал. Строка не та на выходе получилась. Неделю на больнично был. Сейчас всё заново перепробую.
#66 by Shamandafil
А может стоит передать заголовок Accept-Encoding: identity Указав, что клиент может получать только несжатые данные.
#67 by Crush
Исключено:) Клиенту должны отправляться сжатые данные, и распаковка должна проходить на стороне клиента.
#68 by Crush
Автор, ты ГЕНИЙ!!! Спасибо огромное!!! Вот рабочий код. В файле лежит сжатая строка. &НаКлиенте
#69 by Shamandafil
Здесь ADODB.Stream лишний. Почему System.IO.FileStream не использован, можно было на переупаковках сэкономить. И потоки зря не закрыты после использования.
#70 by Crush
ADODB.Stream здесь только для теста (что б вытащить строку из файла) А так то сжатый массив получаю из WinHttp.WinHttpRequest.5.1 WinHttp.responseBody
#71 by Garykom
адодб не лишний походу, а чтобы ВК на клиенте не ставить, только нас сервере
#72 by Serginio1
#73 by Serginio1
Или
#74 by Serginio1
Правда не забывай закрыть ресурсы ЗакрытьРесурс(ПотокСжатыхДанных)
#75 by Serginio1
Телодвижений значительно меньше. А если приходит ответ Content-Encoding: gzip То должен автоматически разжиматься как в 30
#76 by Crush
Попробую с ним разобраться как заголовки передавать и POST-запрос. т.е. ресурс сам не закрывается при выходе из процедуры? Или это от того, что переменная врап - глобальная?
#77 by trdm
+ И будет то, что дохтур прописал.
#78 by Garykom
неа, для 1С-ника проще с .Net разобраться чем с C++ и написанием своих ВК или аналогов
#79 by Serginio1
А они автоматически передаются HttpClient=Врап.ПолучитьТипИзСборки("System.Net.Http.HttpClient","System.Net.Http.dll");
#80 by Serginio1
Особенность .Net в том, что если ты не закрыл ресурсы, то они закроются только после сборки мусора, а этот момент может наступить не скоро
#81 by Serginio1
Посмотри фиддлером какие заголовки отправляются и приходят
Тэги:
Ответить:
Комментарии доступны только авторизированным пользователям

В этой группе 1С