|
Распаковка bzip2 | ☑ | ||
---|---|---|---|---|
0
NeiTRoN4ik
10.11.20
✎
10:52
|
Добрый день. От мед. лаборатории посредством POST запроса приходят данные в виде xml запакованные в bzip2 и обернутые в base64. Проблема в bzip2.. ЧтениеZipФайла не работает, говорит некорректный вид файла.
Нашел тему Распаковка gzip строки , но по аналогии с bzip2 так не работает. Может, кто сталкивался? Спасибо |
|||
1
Serginio1
10.11.20
✎
11:03
|
||||
2
polosov
10.11.20
✎
12:02
|
||||
3
NeiTRoN4ik
10.11.20
✎
13:18
|
(2) Спасибо, но из описания там тоже только работа с gzip
(1) Благодарю. Но теперь вопросов еще больше)) Поставил Visio Studio, вроде как сгенерировал необходимый пакет. Но что дальше делать не понимаю. Что нужно сделать, чтобы к этому пакету можно было обраться через NetObjectToIDispatch45. Или это вообще не так работает? |
|||
4
arsik
гуру
10.11.20
✎
13:38
|
(0) Ты гонишь. Есть bzip в 1С.
МетодСжатияZIP (ZIPCompressionMethod)
с версии 8.3.7 |
|||
5
ДенисЧ
10.11.20
✎
13:39
|
man bnzip2
winrar, насколько мой эклер напоминает, тоже умеет |
|||
6
polosov
10.11.20
✎
13:45
|
(0) Если ты точно уверен, что у тебя приходит bzip2, то возможно это тоже беззаголовочный пакет. По аналогии с gzip в (2) сделай для него добавление заголовка и распаковывай стандартными средствами.
|
|||
7
polosov
10.11.20
✎
13:52
|
+(6) или вместо файла засунь данные в поток и скорми ЧтениеZipФайла
|
|||
8
NeiTRoN4ik
10.11.20
✎
14:17
|
(4) Да, я это видел, но данные не читаются.
(6) Разработчики с той стороны утверждают, что именно bzip2. Кстати, возможно, там же просто текст запакован. Спасибо, попробую |
|||
9
NeiTRoN4ik
10.11.20
✎
14:23
|
(7) Я так пробовал, после перевода из base64 в двоичные данные. Потом в поток и ЧтениеZipФайла, но он все равно говорит, что некорректный файл
|
|||
10
arsik
гуру
10.11.20
✎
14:40
|
(9) Ну значит у тебя файл не совсем bzip2 или как сказал (6) у тебя не архив с файлами, а чисто данные в обертке bzip2
|
|||
11
arsik
гуру
10.11.20
✎
14:42
|
(10) Попроси их отдавать данные без упаковки. В заголовке http запроса укажи что нужно без упаковки.
|
|||
12
minsk1s
10.11.20
✎
14:49
|
Только батником по аналогии:
https://1cnik.by/rar.php |
|||
13
NeiTRoN4ik
10.11.20
✎
14:56
|
(12) Да, до этой идеи я тоже дошел и она работает. Но это вообще самый последний вариант, если ничего не получится. К тому же он только на клиенте работает, а результаты анализов по хорошему регл. заданием получать надо
|
|||
14
NeiTRoN4ik
10.11.20
✎
14:57
|
(11) Я же правильно понимаю, что ты говоришь о:
Заголовки = Новый Соответствие; Заголовки.Вставить("Accept-Encoding", "identity"); Запрос = Новый HTTPЗапрос(Ресурс, Заголовки); |
|||
15
arsik
гуру
10.11.20
✎
15:35
|
(14) Да. Про это.
Если это не работает ну свяжись с сервисом, откуда данные забираешь, может у них свой параметр запроса есть или свой заголовок для получения данных без упаковки. |
|||
16
arsik
гуру
10.11.20
✎
15:37
|
(15) Ну еще можешь вместо identity попробовать deflate.
|
|||
17
Serginio1
10.11.20
✎
15:44
|
||||
18
NeiTRoN4ik
10.11.20
✎
15:57
|
(15) К сожалению не работают оба варианта. Я с ними уже неделю переписываюсь.. на просьбу отправлять без упаковки получил ответ - "точно должен быть способ, эти методы уже много лет самые разные разработчики используют"
Так что..)) |
|||
19
NeiTRoN4ik
10.11.20
✎
16:00
|
(17) Ух..сколько интересного )) Спасибо
|
|||
20
arsik
гуру
10.11.20
✎
16:00
|
(18) Ну deflate пакует, но в zip.
|
|||
21
NeiTRoN4ik
10.11.20
✎
16:03
|
(20) Ну я так понимаю, это работает, если разработчик с той стороны предусмотрел такой вариант?
|
|||
22
arsik
гуру
10.11.20
✎
16:04
|
(21) Ну да. Но не совсем разработчик, а админ http сервера.
|
|||
23
NeiTRoN4ik
10.11.20
✎
16:08
|
(22) Видимо они по каким-то причинам используют только один вариант с bzip, еще и плюсом его закидывают сверху в base64
|
|||
24
arsik
гуру
10.11.20
✎
16:13
|
(23) А ты вообще уверен, что у тебя там bzip2?
|
|||
25
NeiTRoN4ik
10.11.20
✎
16:26
|
(24) ну разработчики утверждают, что bzip2. Ну и если двоичные данные из ответа сохранить в файл, то через winrar открывается
|
|||
26
arsik
гуру
10.11.20
✎
16:28
|
Заголовок покажи такой. Вот например bzip2
https://i.imgur.com/BS2Ijcw.png |
|||
27
NeiTRoN4ik
10.11.20
✎
16:30
|
(26) BZh91AY&SY"« ЂPюЂ /зЭА d4#ИЙ==Qй...
|
|||
28
NeiTRoN4ik
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> |
|||
29
H A D G E H O G s
10.11.20
✎
18:56
|
(28) Скиньте файл куданибудь
|
|||
30
NeiTRoN4ik
10.11.20
✎
19:18
|
||||
31
NeiTRoN4ik
10.11.20
✎
19:23
|
вообще ответ от сервера такой:
<?xml version="1.0" encoding="utf-8"?> <string xmlns="">QlpoOTFBWSZTWRciEasAABcdgFAD/geAIC/n3cAgAGQ0EiPIyT09UekNqaP1IJU0TQDJiAAAZb8JY/YnJr6ljRAI8hcwxaK3VqpATbuQFA7oL22hcZJ6gtT4+ywwith4kUw46YuF5eIz/ab0oZjWoUWIPj60uFjvhs7zYrUyEiRMPYEVxRIKx/F3JFOFCQFyIRqw</string> |
|||
32
NeiTRoN4ik
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 ? )))
|
|||
34
NeiTRoN4ik
11.11.20
✎
10:15
|
(33) Ну я и говорю не совсем все понятно ))
|
|||
35
arsik
гуру
11.11.20
✎
10:16
|
(33) А зачем? Можно же использовать NetObjectToIDispatch45 от Serginio1
|
|||
36
NeiTRoN4ik
11.11.20
✎
10:20
|
(35) Можно, пока что изучаю что к чему там.
Просто поинтересовался, вдруг все-таки можно обойтись вообще штатными средствами 1С |
|||
37
NeiTRoN4ik
11.11.20
✎
10:21
|
(35) ааа, сори, это ты не на мое сообщение ответил)
|
|||
38
ДенисЧ
11.11.20
✎
10:23
|
(34) Да всё понятно. провидер как раз и распаковывает. Всё остальное - обёртка.
|
|||
39
NeiTRoN4ik
11.11.20
✎
10:30
|
(38) То есть сама распаковка тут?
Stream s2 = InputStream(new MemoryStream(bytesToDecompress), provider) |
|||
40
ДенисЧ
11.11.20
✎
10:32
|
(39) Другой распаковки в приведённом коде нет. Всё остальное - просто перекладывание байтиков из потока в поток
|
|||
41
Djelf
11.11.20
✎
10:36
|
(31) Все понятно с этим файлом. Там действительно bzip2, но bzip2 еще и как контейнер, а 1С при ЗаписьZipФайла и ЧтениеZipФайла работает с контейнером zip, а МетодСжатияZIP.BZIP2 это сжатие внутри контейнера. Т.е. только через вк получится...
|
|||
42
Djelf
11.11.20
✎
14:20
|
+(41) А можно и без ВК. Набросал декодер на Golang для Win64: https://cloud.mail.ru/public/2vqM/2MZ1ctyLA
По-умолчанию запускается как вэб сервис на порту 9090, но можно на любом порту go_bzip2zip.exe 9080 Ну и с обработка кодированной строки из (31)
|
|||
43
polosov
11.11.20
✎
14:46
|
(42) Вам, гошникам, лишь бы сервисы писать.
|
|||
44
NeiTRoN4ik
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(Данные); |
|||
45
NeiTRoN4ik
11.11.20
✎
14:57
|
(42) Отдельное Спасибо, просто реализовал через NetObjectToIDispatch45 раньше чем увидел сообщение
|
|||
46
oleg_km
11.11.20
✎
16:15
|
(45) Зато тебе открылся дивный мир .NET. Почти весь стандартный .NET плюс тыщи разных других сборок практически безгранично расширяют возможности 1С.
|
|||
47
Djelf
11.11.20
✎
16:58
|
(46) На linux, этот дивный мир, накроется медным тазом, не весь, но COMОбъект точно! А прокси-сервера на Golang - никогда ;)
|
|||
48
polosov
11.11.20
✎
17:01
|
(47) Нативные компоненты, написанные на C++ спасут всех. Сервисы это прекрасно, но не для таких задач.
|
|||
49
Djelf
11.11.20
✎
17:12
|
(48) Уверен? Выполни sql запрос через Native API и что ты получишь? Тыкву?
|
|||
50
Serginio1
11.11.20
✎
18:11
|
||||
51
Serginio1
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). |
|||
52
polosov
11.11.20
✎
19:27
|
(49) Конечно у с++ не такой уровень абстракции, как у го, но поверь к субд подключиться есть чем.
|
|||
53
ДедМорроз
11.11.20
✎
19:32
|
Вместо того,чтобы написать декодер контейнеров было придумано велосипедостпоение высокого уровня сложности.
|
|||
54
NeiTRoN4ik
11.11.20
✎
19:58
|
(53) есть конечно правда в твоих словах. Я когда понял, что штатными средствами не получится, то как раз подумал в этом направлении.
Вот тут подробное описание алгоритма http://www.meshbeyn.de/articles/003.aspx . И вроде все разжевано, но мозгов все равно не хватило (( |
|||
55
arsik
гуру
11.11.20
✎
20:25
|
(54) Это теория вот алгоритм на go. Переложить на 1С проще некуда :)
https://golang.org/src/compress/bzip2/bzip2.go |
|||
56
NeiTRoN4ik
12.11.20
✎
14:05
|
(55) А вот насчет проще некуда, это ирония или нет? ))
Вообще ради интереса попробую в свободное время |
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |