Вход | Регистрация
 
1С:Предприятие :: 1С:Предприятие 8 общая

Распаковка bzip2

Распаковка bzip2
Я
   NeiTRoN4ik
 
10.11.20 - 10:52
Добрый день. От мед. лаборатории посредством POST запроса приходят данные в виде xml запакованные в bzip2 и обернутые в base64. Проблема в bzip2.. ЧтениеZipФайла не работает, говорит некорректный вид файла.
Нашел тему Распаковка gzip строки , но по аналогии с bzip2 так не работает. Может, кто сталкивался? Спасибо
   Serginio1
 
1 - 10.11.20 - 11:03
   polosov
 
2 - 10.11.20 - 12:02
   NeiTRoN4ik
 
3 - 10.11.20 - 13:18
(2) Спасибо, но из описания там тоже только работа с gzip
(1) Благодарю. Но теперь вопросов еще больше)) Поставил Visio Studio, вроде как сгенерировал необходимый пакет. Но что дальше делать не понимаю. Что нужно сделать, чтобы к этому пакету можно было обраться через NetObjectToIDispatch45. Или это вообще не так работает?
   arsik
 
4 - 10.11.20 - 13:38
(0) Ты гонишь. Есть bzip в 1С.
МетодСжатияZIP (ZIPCompressionMethod)
BZIP2 (BZIP2)
Описание:
Сжатие выполняется с помощью алгоритма BZIP. 
Занимает существенно больше времени, при этом данные сжимаются лучше, чем с помощью алгоритма Deflate.

с версии 8.3.7
   ДенисЧ
 
5 - 10.11.20 - 13:39
man bnzip2

winrar, насколько мой эклер напоминает, тоже умеет
   polosov
 
6 - 10.11.20 - 13:45
(0) Если ты точно уверен, что у тебя приходит bzip2, то возможно это тоже беззаголовочный пакет. По аналогии с gzip в (2) сделай для него добавление заголовка и распаковывай стандартными средствами.
   polosov
 
7 - 10.11.20 - 13:52
+(6) или вместо файла засунь данные в поток и скорми ЧтениеZipФайла
   NeiTRoN4ik
 
8 - 10.11.20 - 14:17
(4) Да, я это видел, но данные не читаются.
(6) Разработчики с той стороны утверждают, что именно bzip2. Кстати, возможно, там же просто текст запакован. Спасибо, попробую
   NeiTRoN4ik
 
9 - 10.11.20 - 14:23
(7) Я так пробовал, после перевода из base64 в двоичные данные. Потом в поток и ЧтениеZipФайла, но он все равно говорит, что некорректный файл
   arsik
 
10 - 10.11.20 - 14:40
(9) Ну значит у тебя файл не совсем bzip2 или как сказал (6) у тебя не архив с файлами, а чисто данные в обертке bzip2
   arsik
 
11 - 10.11.20 - 14:42
(10) Попроси их отдавать данные без упаковки. В заголовке http запроса укажи что нужно без упаковки.
   minsk1s
 
12 - 10.11.20 - 14:49
Только батником по аналогии:
https://1cnik.by/rar.php
   NeiTRoN4ik
 
13 - 10.11.20 - 14:56
(12) Да, до этой идеи я тоже дошел и она работает. Но это вообще самый последний вариант, если ничего не получится. К тому же он только на клиенте работает, а результаты анализов по хорошему регл. заданием получать надо
   NeiTRoN4ik
 
14 - 10.11.20 - 14:57
(11) Я же правильно понимаю, что ты говоришь о:

    Заголовки = Новый Соответствие;  
    Заголовки.Вставить("Accept-Encoding", "identity");
    
    Запрос = Новый HTTPЗапрос(Ресурс, Заголовки);
   arsik
 
15 - 10.11.20 - 15:35
(14) Да. Про это.
Если это не работает ну свяжись с сервисом, откуда данные забираешь, может у них свой параметр запроса есть или свой заголовок для получения данных без упаковки.
   arsik
 
16 - 10.11.20 - 15:37
(15) Ну еще можешь вместо identity попробовать deflate.
   Serginio1
 
17 - 10.11.20 - 15:44
   NeiTRoN4ik
 
18 - 10.11.20 - 15:57
(15) К сожалению не работают оба варианта. Я с ними уже неделю переписываюсь.. на просьбу отправлять без упаковки получил ответ - "точно должен быть способ, эти методы уже много лет самые разные разработчики используют"
Так что..))
   NeiTRoN4ik
 
19 - 10.11.20 - 16:00
(17) Ух..сколько интересного )) Спасибо
   arsik
 
20 - 10.11.20 - 16:00
(18) Ну deflate пакует, но в zip.
   NeiTRoN4ik
 
21 - 10.11.20 - 16:03
(20) Ну я так понимаю, это работает, если разработчик с той стороны предусмотрел такой вариант?
   arsik
 
22 - 10.11.20 - 16:04
(21) Ну да. Но не совсем разработчик, а админ http сервера.
   NeiTRoN4ik
 
23 - 10.11.20 - 16:08
(22) Видимо они по каким-то причинам используют только один вариант с bzip, еще и плюсом его закидывают сверху в base64
   arsik
 
24 - 10.11.20 - 16:13
(23) А ты вообще уверен, что у тебя там bzip2?
   NeiTRoN4ik
 
25 - 10.11.20 - 16:26
(24) ну разработчики утверждают, что bzip2. Ну и если двоичные данные из ответа сохранить в файл, то через winrar открывается
   arsik
 
26 - 10.11.20 - 16:28
Заголовок покажи такой. Вот например bzip2
https://i.imgur.com/BS2Ijcw.png
   NeiTRoN4ik
 
27 - 10.11.20 - 16:30
(26) BZh91AY&SY"«  ЂPюЂ /зЭА  d4#ИЙ==Qй...
   NeiTRoN4ik
 
28 - 10.11.20 - 16:34
Вот полностью:
BZh91AY&SY"«  ЂPюЂ /зЭА  d4#ИЙ==Qй

©Јх •4M Й€  eї    cц'&ѕҐЌт0Еў·VЄ@M»ђи/mЎq’z‚Фшы,0ЉШx‘L8й‹…ев3э¦фЎ˜ЦЎE€>>ґёXп†Оуbµ2$L=ЃЕ
Зсw$S…    r!°

Если открыть через winrar:
<?xml version="1.0" encoding="windows-1251"?><phox-response><content><o n=""><f t="I" n="version" v="13104" /><s n="material" /></o></content></phox-response>
   H A D G E H O G s
 
29 - 10.11.20 - 18:56
(28) Скиньте файл куданибудь
   NeiTRoN4ik
 
30 - 10.11.20 - 19:18
 
 Рекламное место пустует
   NeiTRoN4ik
 
31 - 10.11.20 - 19:23
вообще ответ от сервера такой:
<?xml version="1.0" encoding="utf-8"?>
<string xmlns="">QlpoOTFBWSZTWRciEasAABcdgFAD/geAIC/n3cAgAGQ0EiPIyT09UekNqaP1IJU0TQDJiAAAZb8JY/YnJr6ljRAI8hcwxaK3VqpATbuQFA7oL22hcZJ6gtT4+ywwith4kUw46YuF5eIz/ab0oZjWoUWIPj60uFjvhs7zYrUyEiRMPYEVxRIKx/F3JFOFCQFyIRqw</string>
   NeiTRoN4ik
 
32 - 11.11.20 - 10:10
В общем они мне признались, что у них у самих в одной из лабораторий стоит 1С. И они используют winrar для распаковки.. ну так себе конечно.
Выпросил у них, как они в своей родной системе распаковывают. Они на C# пишут. Скинули вот такой кусок:

public static byte[] DeCompress(byte[] bytesToDecompress, CompressionType provider)
{
    byte[] writeData = new byte[4096];
    Stream s2 = InputStream(new MemoryStream(bytesToDecompress), provider);    
    MemoryStream outStream = new MemoryStream();
    while(true)
    {
        int size = s2.Read(writeData, 0, writeData.Length);
        if (size > 0)
        {
            outStream.Write(WriteData, 0, size);
        }
        else
        {
            break;
        }
    }
    s2.Close();
    byte[] outArr = outStream.ToArray();
    outStream.Close();
    return outArr;
}

Вроде не сложно и интуитивно понятно, но не все к сожалению. Может, кто скажет, реально этот алгоритм реализовать в 1С с помощью потоков?
   ДенисЧ
 
33 - 11.11.20 - 10:12
А у тебя в 1с есть CompressionType ? )))
   NeiTRoN4ik
 
34 - 11.11.20 - 10:15
(33) Ну я и говорю не совсем все понятно ))
   arsik
 
35 - 11.11.20 - 10:16
(33) А зачем? Можно же использовать NetObjectToIDispatch45 от Serginio1
   NeiTRoN4ik
 
36 - 11.11.20 - 10:20
(35) Можно, пока что изучаю что к чему там.
Просто поинтересовался, вдруг все-таки можно обойтись вообще штатными средствами 1С
   NeiTRoN4ik
 
37 - 11.11.20 - 10:21
(35) ааа, сори, это ты не на мое сообщение ответил)
   ДенисЧ
 
38 - 11.11.20 - 10:23
(34) Да всё понятно. провидер как раз и распаковывает. Всё остальное - обёртка.
   NeiTRoN4ik
 
39 - 11.11.20 - 10:30
(38) То есть сама распаковка тут?

Stream s2 = InputStream(new MemoryStream(bytesToDecompress), provider)
   ДенисЧ
 
40 - 11.11.20 - 10:32
(39) Другой распаковки в приведённом коде нет. Всё остальное - просто перекладывание байтиков из потока в поток
   Djelf
 
41 - 11.11.20 - 10:36
(31) Все понятно с этим файлом. Там действительно bzip2, но bzip2 еще и как контейнер, а 1С при ЗаписьZipФайла и ЧтениеZipФайла работает с контейнером zip, а МетодСжатияZIP.BZIP2 это сжатие внутри контейнера. Т.е. только через вк получится...
   Djelf
 
42 - 11.11.20 - 14:20
+(41) А можно и без ВК. Набросал декодер на Golang для Win64: https://cloud.mail.ru/public/2vqM/2MZ1ctyLA
По-умолчанию запускается как вэб сервис на порту 9090, но можно на любом порту go_bzip2zip.exe 9080
Ну и с обработка кодированной строки из (31)
Процедура Декодер(Команда)
    ТекстЗапроса = "QlpoOTFBWSZTWRciEasAABcdgFAD/geAIC/n3cAgAGQ0EiPIyT09UekNqaP1IJU0TQDJiAAAZb8JY/YnJr6ljRAI8hcwxaK3VqpATbuQFA7oL22hcZJ6gtT4+ywwith4kUw46YuF5eIz/ab0oZjWoUWIPj60uFjvhs7zYrUyEiRMPYEVxRIKx/F3JFOFCQFyIRqw";
    HTTPЗапрос = Новый HTTPЗапрос("decode");
    HTTPЗапрос.УстановитьТелоИзСтроки(ТекстЗапроса);
    HTTPСоединение = Новый HTTPСоединение("127.0.0.1",9090);
    HTTPОтвет = HTTPСоединение.ОтправитьДляОбработки(HTTPЗапрос);
    ТекстОтвета = HTTPОтвет.ПолучитьТелоКакСтроку();
    Сообщить(ТекстОтвета);
КонецПроцедуры

<?xml version="1.0" encoding="windows-1251"?><phox-response><content><o n=""><f t="I" n="version" v="13104" /><s n="material" /></o></content></phox-response>


   polosov
 
43 - 11.11.20 - 14:46
(42) Вам, гошникам, лишь бы сервисы писать.
   NeiTRoN4ik
 
44 - 11.11.20 - 14:56
Всем спасибо за помощь, реализовал через NetObjectToIDispatch45
Итоговый код:

    врап=новый COMОбъект("NetObjectToIDispatch45");     
    
    BZip2 = Врап.ПолучитьТипИзСборки("ICSharpCode.SharpZipLib.BZip2.BZip2","C:\Users\79090\Desktop\SharpZipLib-master\src\ICSharpCode.SharpZipLib\bin\Debug\net45\ICSharpCode.SharpZipLib.dll");
    
    UTF8=Врап.ПолучитьТип("System.Text.Encoding").UTF8;
    Stream=Врап.ПолучитьТип("System.IO.MemoryStream");
    ПотокРазжатыхДанных = врап.СоздатьОбъект(Stream);
    Convert=Врап.ПолучитьТип("System.Convert");
    compressed=Convert.FromBase64String(стр64);
    
    ПотокСжатыхДанных = врап.СоздатьОбъект(Stream,compressed);
    
    BZip2.Decompress(ПотокСжатыхДанных, ПотокРазжатыхДанных, TRUE);
    
    Данные=ПотокРазжатыхДанных.ToArray();
    output = UTF8.GetString(Данные);
   NeiTRoN4ik
 
45 - 11.11.20 - 14:57
(42) Отдельное Спасибо, просто реализовал через NetObjectToIDispatch45 раньше чем увидел сообщение
   oleg_km
 
46 - 11.11.20 - 16:15
(45) Зато тебе открылся дивный мир .NET. Почти весь стандартный .NET плюс тыщи разных других сборок практически безгранично расширяют возможности 1С.
   Djelf
 
47 - 11.11.20 - 16:58
(46) На linux, этот дивный мир, накроется медным тазом, не весь, но COMОбъект точно! А прокси-сервера на Golang - никогда ;)
   polosov
 
48 - 11.11.20 - 17:01
(47) Нативные компоненты, написанные на C++ спасут всех. Сервисы это прекрасно, но не для таких задач.
   Djelf
 
49 - 11.11.20 - 17:12
(48) Уверен? Выполни sql запрос через Native API и что ты получишь? Тыкву?
   Serginio1
 
50 - 11.11.20 - 18:11
   Serginio1
 
51 - 11.11.20 - 18:15
50 + Ну когда я делал не было нужды в линуксе.
Нужно добавить условную компиляцию и
используя данную статью https://docs.microsoft.com/ru-ru/dotnet/core/tutorials/netcore-hosting
использовать dlopen (в Linux или macOS).

Шаг 1. Поиск и загрузка CoreCLR

Интерфейсы API среды выполнения .NET Core находятся в coreclr.dll (в Windows), в libcoreclr.so (на платформе Linux) или в libcoreclr.dylib (в macOS). Первым шагом для размещения .NET Core является загрузка библиотеки CoreCLR. Некоторые основные приложения проверяют разные пути или используют входные параметры для поиска библиотеки, пока другие могут загрузить ее по заранее определенному пути (рядом с основным приложением, например, или из известного расположения на компьютере).
После обнаружения библиотека загружается с помощью LoadLibraryEx (в Windows) или dlopen (в Linux или macOS).
   polosov
 
52 - 11.11.20 - 19:27
(49) Конечно у с++ не такой уровень абстракции, как у го, но поверь к субд подключиться есть чем.
   ДедМорроз
 
53 - 11.11.20 - 19:32
Вместо того,чтобы написать декодер контейнеров было придумано велосипедостпоение высокого уровня сложности.
   NeiTRoN4ik
 
54 - 11.11.20 - 19:58
(53) есть конечно правда в твоих словах. Я когда понял, что штатными средствами не получится, то как раз подумал в этом направлении.
Вот тут подробное описание алгоритма http://www.meshbeyn.de/articles/003.aspx . И вроде все разжевано, но мозгов все равно не хватило ((
   arsik
 
55 - 11.11.20 - 20:25
(54) Это теория вот алгоритм на go. Переложить на 1С проще некуда :)
https://golang.org/src/compress/bzip2/bzip2.go
   NeiTRoN4ik
 
56 - 12.11.20 - 14:05
(55) А вот насчет проще некуда, это ирония или нет? ))
Вообще ради интереса попробую в свободное время


Список тем форума
Рекламное место пустует  Рекламное место пустует
ВНИМАНИЕ! Если вы потеряли окно ввода сообщения, нажмите Ctrl-F5 или Ctrl-R или кнопку "Обновить" в браузере.