0. frkbvfnjh 385 12.03.16 11:59 Сейчас в теме

Внешняя компонента для сжатия/распаковки файлов, двоичных данных и строк по алгоритму Zlib, Deflate и GZip

Внешняя компонента для сжатия/распаковки файлов, двоичных данных и строк по алгоритму Zlib, Deflate и GZip.

Перейти к публикации

Вознаграждение за ответ
Показать полностью
Комментарии
Избранное Подписка Сортировка: Древо
1. fishca 1126 15.03.16 12:38 Сейчас в теме
Исходники компоненты будут?
3. frkbvfnjh 385 15.03.16 13:49 Сейчас в теме
(1) fishca, нет, исходники пока выкладывать не буду :(
6. fishca 1126 15.03.16 16:28 Сейчас в теме
(3) компонента писана на С++ или ???
8. frkbvfnjh 385 15.03.16 18:05 Сейчас в теме
(6) fishca, компонента написана на Delphi
2. nixel 525 15.03.16 12:53 Сейчас в теме
Добро пожаловать в клуб "Yet another unpack"
Скорость работы с тем же zlib сравнивали? Есть прирост?
4. frkbvfnjh 385 15.03.16 13:51 Сейчас в теме
(2) nixel, нет скорость не замерял, не думаю, что есть существенная разница
5. saa@kuzov.org 15.03.16 15:03 Сейчас в теме
В типовом примере ВК на ИТС показано, как передавать двоичные данные из ВК в 1С.
7. frkbvfnjh 385 15.03.16 18:05 Сейчас в теме
(5) saa@kuzov.org, оооо, спасибо, гляну, попробую разобраться
9. biformatus 15.03.16 21:56 Сейчас в теме
12. frkbvfnjh 385 16.03.16 06:19 Сейчас в теме
(9) biformatus, я не знаю, что это за зверь efd, вернее не знаю как устроен этот формат, но обработкой он распаковался, правда что дальше делать с этим файлом, не понятно, видимо нужно знать формат распакованного efd.
15. frkbvfnjh 385 16.03.16 09:12 Сейчас в теме
(13) BorovikSV, да, спасибо, я тоже нарыл эту публикацию, но сам формат файла там не обсуждался :(
10. Arxxximed 8 16.03.16 00:27 Сейчас в теме
Так это же круто))) можно наконец сжатый http ответ дешифровывать . Или не получиться на лету?
11. frkbvfnjh 385 16.03.16 06:00 Сейчас в теме
(10) Arxxximed, со сжатым http-ответом не работал, не знаю как там чего устроено, но если он приходит в виде сжатой строки в BASE64, то по крайней мере можно попробовать.
18. Serginio 746 16.03.16 16:17 Сейчас в теме
(10) http://infostart.ru/public/466052/ Там есть пример использования сжатия трафика.

http://infostart.ru/public/448668/ в 35 есть пример сжатия разжатия
http://www.forum.mista.ru/topic.php?id=765672#72
14. v77 139 16.03.16 08:50 Сейчас в теме
Двоичные данные это VTYPE_BLOB.
function TV8UserObject.V8SetBlob(V: PV8Variant; Value: PByte;
Length: integer): boolean;
16. frkbvfnjh 385 16.03.16 10:50 Сейчас в теме
(14) v77, да, большое спасибо, кажись это оно! Попробую допилить...
17. Steelvan 16.03.16 13:15 Сейчас в теме
Надо добавить возможность шифрования паролем, тогда можно получить симметричное шифрование без использования диска (сейчас нужен диск при использовании ZIP пароля).
19. PLAstic 205 16.03.16 17:16 Сейчас в теме
В папке лежит архив формата gzip с одним файлом внутри. Пытаюсь извлечь файл с помощью РаспаковатьФайл. Спустя ожидание от 2 секунд до 5 минут задумчивости вылетает приятное окно с информированием, что "работа была завершена, перезапустить или завершить работу". Перезапуск не помогает, файл не распаковывается.
Проблема же метода РаспаковатьФайлGZip в том, что под него надо создавать папку из-за проблем с определением имени файла в архиве. Ну создали мы папку, есть на это СоздатьКаталог(). А удалить потом за собой чем?
Сделай функцию, возвращающую массив имён файлов внутри архива и возможность извлечения файла по имени.

Добавлено:
Метод РаспаковатьФайлGZip не работает. На том же архиве с одним файлом внутри. Просто ничего не распаковывает. При этом 7-zip нормально его распаковывает.
20. frkbvfnjh 385 17.03.16 05:59 Сейчас в теме
(19) PLAstic, извините, но не совсем понятно, что Вы делаете. Из текста я понял, что вы gzip файл пытаетесь распаковать методом РаспаковатьФайл. Этот метод не может этого сделать. На данный момент это можно сделать только методом РаспаковатьФайлGZip. И да, за папками нужно следить из 1С самостоятельно, сама компонента ничего удалять не будет. Я добавлю метод получения имени файла и распаковку в файл для GZip. На файл который Вы пытаетесь распаковать я бы посмотрел. Если хотите отправьте мне на почту, я гляну.
21. PLAstic 205 21.03.16 10:00 Сейчас в теме
(20) подскажи, чем удалять папки из 1С?
22. frkbvfnjh 385 21.03.16 11:07 Сейчас в теме
(21) PLAstic, Глобальный контекст (Global context)
УдалитьФайлы (DeleteFiles)
Синтаксис:

УдалитьФайлы(<Путь>, <Маска>)
Параметры:

<Путь> (обязательный)

Тип: Строка.
Путь к удаляемым файлам.
<Маска> (необязательный)

Тип: Строка.
Маска для выбора удаляемых файлов.
Если <Маска> не указана, то удаляются все файлы и каталог <Путь>.
24. PLAstic 205 22.03.16 11:24 Сейчас в теме
(22) изучал недавно, но пропустил последнюю строку. Спасибо.
23. frkbvfnjh 385 21.03.16 11:11 Сейчас в теме
(21) PLAstic, кстати, я обновил публикацию и добавил новые методы, перечитайте публикацию
25. ture 233 19.04.16 18:57 Сейчас в теме
Обрати свой взор на конфиг 1С8 хранящийся на sql. Ты его можешь читать и парсить теперь.
Собственно есть ссылка и имя объекта, надо вынуть УФ форму из соседней базы и нарисовать ее в текущей базе 1С (с представлениями на месте реквизитов объекта).
26. frkbvfnjh 385 20.04.16 05:54 Сейчас в теме
(25) ture, А что такое
конфиг 1С8 хранящийся на sql?
Не совсем понимаю о чем речь, может ссылки по теме дадите...
27. Sam13 247 18.05.16 12:08 Сейчас в теме
Коллеги, плиз, хелп!
Стоит задача подготовить препроводительную ведомость для сбербанка, данные которой должны быть закодированы также в двумерном штрихкоде.
Штрихкод формируется следующим образом:
- формируется XML-описание препроводительной ведомости
- к результирующему XML применяется deflate
- затем результат кодируется base64, к результирующей строке добавляется сигнатура @NN@ - номер версии формата. 01 или 02
c deflate и base64 возникли проблемы.

В инструкции сбербанка приведена закодированная строка (сжатая) и ее xml-исходник и команда проверки (linuxового шелла)
echo "@01@eJw9UMlugzAQvfcrkO/ENoZCpWFy6xe0Z+SAS1CMHWGKmr/vmM2nt4z­fLHD9G22ymCkM3tVMXgRLjGt9N7i+Zt9fn2nFkjBr12nrnamZ8+yK8GwW0yF­0etaYCalSkadZBnwVwDX+huVHkQtZlVIKehL4qpIXXuNDo8qLTOVR3ThMTXs­3M+aiFFklRaEqWdBHVah34LsJYWoxTH330wfgkYDz4+C0bR7engSp5UUICt8­5RJdGWIsWbWk/g9QE+EGiOr+eBuOkBz4DtnQa9OZtOAAKWniHEH7Hs2vEh0P­VfDvW2z8i03VO" | sed 's/@01@//' | base64 -d | zlib-flate -uncompress

Результат:
<?xml version="1.0" encoding="UTF-8" standalone="no"?><p_ved><data>2013-04-22</data><n_ob>795401871100001</n_ob><n_symka>345234</n_symk­a><r_chet>40702810538150003536</r_chet><src>srgdfgs</src><no­minal_kol><nominal>100.00</nominal><kol>1</kol><valcode>810</valcode><valtype>01</v­altype></nominal_kol><symbols><symbol>02</symbol><sum>100.00</sum></symbols></p_ved>

Как я не бился, у меня не удается получить сходный результат.

Как получить результат, который был сходным со сбербанком? Имею ввиду именно кодирование deflate
28. frkbvfnjh 385 18.05.16 15:29 Сейчас в теме
(27) Sam13, ща попробую помочь...
30. Sam13 247 19.05.16 09:58 Сейчас в теме
(29) Serginio, спасибо, почти получилось.
Но я не понял все-таки как сделать deflate твоим (http://www.forum.mista.ru/topic.php?id=765672#61) способом.
Хелпани, плиз.
31. Serginio 746 19.05.16 10:21 Сейчас в теме
Если тебе нужно просто сжать данные и получить Base64

стр = "Строка для теста компрессии декомпрессии"; 
     
    // Получим используемые типы

    MemoryStream=Врап.ПолучитьТип("System.IO.MemoryStream");
    UTF8=Врап.ПолучитьТип("System.Text.Encoding").UTF8;
    CompressionMode = врап.ПолучитьТип("System.IO.Compression.CompressionMode");
    
    
    СжатыйПоток = врап.СоздатьОбъект(MemoryStream);//Поток куда запишутся сжатые данные

    
    
    zipStr = врап.СоздатьОбъект("System.IO.Compression.GZipStream", СжатыйПоток, CompressionMode.Compress);
    
    МассивДанных= UTF8.GetBytes(стр)// Получим массив данных используя кодировку  UTF8

    ПотокДляСжатия = Врап.СоздатьОбъект(MemoryStream,МассивДанных);  // Создадим поток из массива данных


    ПотокДляСжатия.CopyTo(zipStr);
    zipStr.Flush();// Сбросим данные в  СжатыйПоток

    zipStr.Close();// Закроем  GZipStream

    compressed = СжатыйПоток.ToArray();// Получим массив байт сжатых данных


    Convert=Врап.ПолучитьТип("System.Convert");
    стр64=Convert.ToBase64String(compressed);// Переведем сжатые данные в Base64
Показать
32. Serginio 746 19.05.16 10:53 Сейчас в теме
Для Deflate нужно использовать System.IO.Compression.DeflateStream

Заменить на

zipStr = врап.СоздатьОбъект("System.IO.Compression.DeflateStream", СжатыйПоток, CompressionMode.Compress);
33. Sam13 247 19.05.16 13:55 Сейчас в теме
Спасибо тебе за помощь. Алгоритм отработал нормально, выдал результат. Вот только он не совпадает с тем, что выдает linux

Вот код, который я исполняю в 1С:

Стр = "1234567890";
	
	Врап = Новый COMОбъект("NetObjectToIDispatch45");
	MemoryStream=Врап.ПолучитьТип("System.IO.MemoryStream");
	UTF8=Врап.ПолучитьТип("System.Text.Encoding").UTF8;
	CompressionMode = врап.ПолучитьТип("System.IO.Compression.CompressionMode");
	
	СжатыйПоток = врап.СоздатьОбъект(MemoryStream);//Поток куда запишутся сжатые данные

	zipStr = врап.СоздатьОбъект("System.IO.Compression.DeflateStream", СжатыйПоток, CompressionMode.Compress);	
	
	МассивДанных= UTF8.GetBytes(стр);// Получим массив данных используя кодировку  UTF8
	ПотокДляСжатия = Врап.СоздатьОбъект(MemoryStream,МассивДанных);  // Создадим поток из массива данных
	ПотокДляСжатия.CopyTo(zipStr);
	zipStr.Flush();// Сбросим данные в  СжатыйПоток
	zipStr.Close();// Закроем  GZipStream
	
	compressed = СжатыйПоток.ToArray();// Получим массив байт сжатых данных
	
	Convert=Врап.ПолучитьТип("System.Convert");
	стр64=Convert.ToBase64String(compressed);// Переведем сжатые данные в Base64
Показать


Мне возвращается результат: MzQyNjE1M7ewNAAA

Если я делаю методом проверки сбербанка, (echo '1234567890'| zlib-flate -compress | base64), то мне возвращается результат: eJwzNDI2MTUzt7A04AIADUQCGA==
Если пытаюсь результирующую сжатую строку 1с сунуть в линукс, применяю echo 'MzQyNjE1M7ewNAAA'| base64 -d | zlib-flate -uncompress, получаю:
flate: inflate: dat a: incorrect header check

Ну и соответственно алгоритм 1С не может расшифровать строку, которая сжата командой линукс (eJwzNDI2MTUzt7A04AIADUQCGA==)

В чем может быть причина?
34. Serginio 746 19.05.16 14:16 Сейчас в теме
http://stackoverflow.com/questions/34387549/zlib-compression-incompatibile-c-vs-c-sharp-implementations

добавить файлы байты

public static byte[] DecompressZLibRaw(byte[] bCompressed)
{
    byte[] bHdr = new byte[] { 0x1F, 0x8b, 0x08, 0, 0, 0, 0, 0 };

    using (var sOutput = new MemoryStream()) 
    using (var sCompressed = new MemoryStream())
    {
        sCompressed.Write(bHdr, 0, bHdr.Length);
        sCompressed.Write(bCompressed, 0, bCompressed.Length);
        sCompressed.Position = 0;
        using (var decomp = new GZipStream(sCompressed, CompressionMode.Decompress))
        {
            decomp.CopyTo(sOutput);
        }
        return sOutput.ToArray();
    }
}
Показать
35. Sam13 247 19.05.16 17:08 Сейчас в теме
Круто, спасибо. Я даже немножко что-то понял.
Только как это в мой код 1С сунуть?
36. frkbvfnjh 385 20.05.16 07:19 Сейчас в теме
(35) Sam13, кажется я решил Вашу проблему. Если еще интересует могу компоненту допилить под Вас. Дело в том, что Deflate не так прост как кажется... На самом деле вариантов сжатия методом Deflate не меренное множество и в Вашем случае как раз используется самый простой, а я в компоненте использовал алгоритм который использует 1С в формате своих файлов. У меня получилось и сжать и распаковать Ваш xml, все хэш суммы совпали.
37. Sam13 247 20.05.16 09:14 Сейчас в теме
(36) буду очень признателен.
Думаю, что это будет полезно многим, т.к. сейчас сбер многих переводит на печатную форму со штрихкодами. Но для формирования предлагает свой софт.
Неудобно пользоваться еще одной программой, когда уже есть база 1С.
38. frkbvfnjh 385 20.05.16 13:03 Сейчас в теме
(37) Sam13, Обработку с новой компонентой выслал Вам на почту. Проблема оказалась куда глубже чем просто алгоритм сжатия. Дело в том, что в Вашем примере текст должен быть именно в кодировке ANSI, а из 1С, строки можно передать только в уникоде, поэтому помимо смены алгоритма сжатия еще пришлось предварительно менять кодировку строк с UTF8 в ANSI, но в итоге все отработало как надо. В дальнейшем возможно обновлю публикацию и для каждой функции по сжатию строк добавлю аналоги с постфиксом "ANSI" и добавлю функции со стандартным алгоритмом Deflate. Надеюсь помог.
40. dshevchenko 20.05.16 14:16 Сейчас в теме
(38) а можете выслать и мне исправленный вариант? У меня та же проблема, заморочки со Сбербанком.
41. frkbvfnjh 385 20.05.16 15:04 Сейчас в теме
(40) dshevchenko, хорошо, скиньте почту
42. dshevchenko 20.05.16 15:50 Сейчас в теме
(41) в профиле, d.shevchenko@pokupochka.ru , заранее спасибо.
39. frkbvfnjh 385 20.05.16 13:10 Сейчас в теме
(37) Sam13, кстати если работаете в управляемом приложении то перед тестирование предварительно удалите файлы из каталога %APPDATA%\1C\1Cv8\ExtCompT, по крайней мере удалите файл Arc1C.dll, а то 1С будет упорно использовать старую версию...
43. Serginio 746 20.05.16 16:55 Сейчас в теме
(35)
Замени
UTF8=Врап.ПолучитьТип("System.Text.Encoding").UTF8;

на
UTF8=Врап.СоздатьОбъект("System.Text.Encoding",1251);
44. dshevchenko 23.05.16 10:34 Сейчас в теме
Ура, все работает! Тестовые xml, запакованные вашей исправленной
обработкой, нормально распаковываются Сбером. Огромное вам спасибо!
frkbvfnjh; +1 Ответить
45. frkbvfnjh 385 23.05.16 11:13 Сейчас в теме
(44) dshevchenko, спасибо за ответ. Тогда скоро обновлю публикацию...
46. Sam13 247 23.05.16 16:21 Сейчас в теме
Подтверждаю, все работает. Большое спасибо.
Сбер принял штрихкод.
Постараюсь сделать публикацию по формированию ШК
frkbvfnjh; +1 Ответить
48. frkbvfnjh 385 24.05.16 02:25 Сейчас в теме
49. frkbvfnjh 385 24.05.16 05:37 Сейчас в теме
(46) Sam13, обновил публикацию. Можете заново скачать обработку, в новой версии исправил проблемы с кириллицей.
47. Serginio 746 23.05.16 17:47 Сейчас в теме
34+ Если добавить заголовочные файлы то разжимает

врап=новый COMОбъект("NetObjectToIDispatch45");
	MemoryStream=Врап.ПолучитьТип("System.IO.MemoryStream");
    UTF8=Врап.ПолучитьТип("System.Text.Encoding").UTF8;
    CompressionMode = врап.ПолучитьТип("System.IO.Compression.CompressionMode");
    UTF8=Врап.ПолучитьТип("System.Text.Encoding").GetEncoding(1251);
    Convert=Врап.ПолучитьТип("System.Convert");
	
	Загол= Convert.FromBase64String("H4sIAAAAAAA=");
    стр64="eJwzNDI2MTUzt7A04AIADUQCGA==";
	compressed=Convert.FromBase64String(стр64);
    
	
ПотокСжатыхДанных = врап.СоздатьОбъект(MemoryStream);
ПотокСжатыхДанных.Write(Загол, 0,   Загол.GetLength(0));
ПотокСжатыхДанных.Write(compressed, 0, compressed.GetLength(0));

ПотокСжатыхДанных.Position = 0;
GZipПоток =врап.СоздатьОбъект("System.IO.Compression.GZipStream",ПотокСжатыхДанных, CompressionMode.Decompress);
ПотокРазжатыхДанных = врап.СоздатьОбъект(MemoryStream);
GZipПоток.CopyTo(ПотокРазжатыхДанных);
Данные=ПотокРазжатыхДанных.ToArray();
 output = UTF8.GetString(Данные);

    Сообщить(output);
Показать
50. vit-vas 07.10.16 12:57 Сейчас в теме
На 1С сервере 64 bit не работает что ли?
51. frkbvfnjh 385 10.10.16 05:50 Сейчас в теме
(50) vit-vas, странно, в теории должно работать... Как проверю, отпишусь, по возможности исправлю.
54. vit-vas 07.11.16 00:25 Сейчас в теме
55. frkbvfnjh 385 07.11.16 11:34 Сейчас в теме
(54) vit-vas, какая ошибка выходит? Теоретически должно все работать, у меня нет возможности проверить, т.к. нет 64-го сервера 1С.
58. frkbvfnjh 385 25.01.17 08:59 Сейчас в теме
65. user894822 16.02.18 12:42 Сейчас в теме
(58) На 64 бит сервере не работает. Пытаюсь выполнить РаспаковатьСтрокуBase64 в фоновом процессе. Что происходит, непонятно, но что-то настолько плохое, что даже блок Попытка-Исключение это не ловит, процесс просто аварийно завершается.
52. biformatus 19.10.16 23:03 Сейчас в теме
53. frkbvfnjh 385 20.10.16 06:25 Сейчас в теме
(52) biformatus, дайте формат efd, я сделаю... Я нигде не нашел описания формата. На инфостарте есть плагин для тотал коммандера, но автор то исходник не даст и формат не расскажет, а реверсингом нет ни желания, ни времени, ни опыта заниматься..
56. Serginio 746 07.11.16 12:26 Сейчас в теме
Поставь 64 разрядного 8.3.9 клиента. Полезно для отладки
57. mbzapas 15.11.16 16:00 Сейчас в теме
Что-то пошло не так...
Данные взяты из 1CD:
Исходная строка: {2,e0666db2-45d6-49b4-a200-061c6ba7d569,}
Упаковано компонентой: eJwdjAkKgDAQxPIgC1V60OdY7SvEvzcsA0vIDPtxcbDItMjL1CQKVW5BQ1ek­2yabFOuTxzu13WWV
h59+NrkRCpE=
Хранится в 1CD: e797f7WRTqqBmZlZSpKRrolpipmuiWWSiW6ikYGBroGZYbJZUqJ5iqmZpU4t­AA==

Это еще один вариант Deflate или неправильно пользуюсь компонентой?

P.S. на 64-bit текущая версия работать точно не может. :(
59. frkbvfnjh 385 25.01.17 09:03 Сейчас в теме
(57)
e797f7WRTqqBmZlZSpKRrolpipmuiWWSiW6ikYGBroGZYbJZUqJ5iqmZpU4t­AA==
Подозреваю, что строка в данном случае храниться в base64, а не сжатая дефлейтом. Поддержку 64 bit добавил
60. МихаилМ 25.01.17 16:52 Сейчас в теме
и бэйс и дефлэйт (стандартный) есть в 1с8 .

если автор добавит Zopfli. тогда хоть какой-то смысл будет
66. user894822 16.02.18 12:45 Сейчас в теме
(60) поделитесь, где в 1с8 функция распаковки дефлета?
67. МихаилМ 16.02.18 13:53 Сейчас в теме
68. user894822 19.02.18 00:34 Сейчас в теме
(67) Я видел. Он через файлы работает, а хотелось бы в памяти. Второй недостаток - всегда выдает исключение, т.к. не знает правильной контрольной суммы исходных данных. Т.е. невозможно контролировать целостность данных.
69. frkbvfnjh 385 19.02.18 04:58 Сейчас в теме
(68) До недавнего времени из внешних компонент не возможно было передавать двоичные данные в 1С, поэтому работа с двоичными данными только через файлы. Начиная с последних платформ такая возможность появилась, будет время, попробую доработать. А по поводу контрольных сумм - за этим следите сами, т.к. это чистый deflate, если нужны контрольные суммы, то пользуйтесь встроенным zip'ом или gzip'ом встроенным в данную внешнюю компоненту.
70. user894822 19.02.18 09:13 Сейчас в теме
(69) По поводу контрольных сумм - мой ответ был Михаилу, по поводу другой обработки, которая работает путем добавления к дефлету заголовка zip-формата и затем использует 1с-овскую функцию распаковки zip.
В моём случае сжатые данные поступают в формате zlib (см. rfc-1950), от чистого дефлета он отличается наличием 2-байтного заголовка в начале и 4-байтной контрольной суммы ADLER32 в конце. Поэтому мне приходится сначала отсекать заголовок zlib.

Функция РаспаковатьДвоичныеДанные(ДД, ZLIB)
	
	Буфер = ПолучитьБуферДвоичныхДанныхИзДвоичныхДанных(ДД);
	
	// Получить срез со смещением 2 байта, чтобы пропустить заголовок формата ZLIB (RFC-1950)
	Срез = Буфер.ПолучитьСрез(2, Буфер.Размер - 2);
	
	СтрокаBase64 = ПолучитьBase64СтрокуИзБуфераДвоичныхДанных(Срез);
	Возврат ZLIB.РаспаковатьСтрокуBase64(СтрокаBase64);

КонецФункции
Показать


А контрольную сумму я даже не проверяю, т.к. средствами 1С она считается очень медленно. Когда я, в порядке прикола, написал свой собственный распаковщик дефлета на языке 1С, цикл вычисления контрольной суммы занимал 25% (!) общего времени выполнения. А полное время распаковки составляло что-то около 10 секунд на 50кб сжатых данных.
71. user894822 19.02.18 11:16 Сейчас в теме
(69) Разобрался, почему была фатальная ошибка на клиенте. Если получать строку base64 прямо из буфера двоичных данных (ПолучитьBase64СтрокуИзБуфераДвоичныхДанных), то при передаче этой строки в вашу ВК почему-то случается фатальная ошибка. А если сначала получить двоичные данные из буфера (ПолучитьДвоичныеДанныеИзБуфераДвоичныхДанных), а потом из этих двоичных данных получить строку base64 (ПолучитьBase64СтрокуИзДвоичныхДанных), тогда фатальной ошибки не происходит.

Но на 64-бит сервере такое решение всё равно не помогло, по-прежнему вылетает фатальная ошибка. Возможно, это потому, что на сервере я использую синхронную версию ВК?

И ещё одна странность обнаружилась. Если я сохраняю сжатые данные в файл (чистый дефлет), то ваша внешняя обработка этот файл успешно распаковывает. Но если я эти же данные перегоняю в base64 и пытаюсь распаковать функцией НачатьВызовРаспаковатьСтрокуBase64, то ВК выдает ошибку - на этот раз не фатальную, просто "Ошибка внешней компоненты".
72. frkbvfnjh 385 19.02.18 11:58 Сейчас в теме
(71) Спасибо за подробный комментарий, нужно переварить и обдумать все написанное Вами, давно не занимался этой компонентой. Нужно проверить на совместимость этой компоненты с новыми методами платформы по работе с двоичными данными которые появились. Постараюсь выбрать время, переосмыслить всю работу компоненты и по возможности усовершенствовать ее...
73. user894822 19.02.18 12:26 Сейчас в теме
(72) Было бы неплохо. Сейчас мне на сервере придётся выкручиваться через zip-файлы.

Вообще, работа с буферами двоичных данных в платформе пока еще сыровата. Вот еще пример. Я читаю сжатые данные из внешнего источника (база MSSQL). В выборке из запроса поле blob возвращается в виде объекта ДвоичныеДанные. При попытке вызвать ПолучитьБуферДвоичныхДанныхИзДвоичныхДанных() прямо по полю выборки, происходит фатальная ошибка (серверный процесс вылетает). А если поле выборки сначала присвоить промежуточной переменной, а потому уже получить буфер по этой переменной - тогда всё в порядке.
74. frkbvfnjh 385 20.02.18 06:37 Сейчас в теме
(73) Вроде начал разбираться в коде своего проекта. Компоненту сейчас дорабатываю, подождите пару дней. В Вашем случае функция РаспаковатьСтрокуBase64 не буде работать, т.к. она предназначена для других целей - она распаковывает именно обычный текст сжатый с помощью функции СжатьСтрокуBase64 (посмотрите пример в обработке). Так что в Вашем случае действительно нужно распаковывать только через файлы. Сейчас я добавлю функции именно по сжатию и распаковке двоичных данных. Почему я это не сделал изначально, что бы двоичные данные можно было передать хотя бы в виде строки base64, я не сам не понимаю, видимо посчитал, что работы с файлами будет достаточно, т.к. делал обработку в основном для собственных нужд, но как оказалось для других эта тема тоже актуальна. Поэтому постараюсь сейчас доработать все должным образом и сделать описание более понятным языком.
75. frkbvfnjh 385 20.02.18 07:21 Сейчас в теме
(73) Кстати, если хотите, то можете мне дать ваши данные в формате zlib rfc-1950, попробую их распаковать без 1Совских ухищрений, если получится, то включу методы во внешнюю компоненту
76. user894822 21.02.18 12:25 Сейчас в теме
(75) Вот образец. Пароль архива отправил в личку.
Прикрепленные файлы:
blob.zip
77. frkbvfnjh 385 22.02.18 10:49 Сейчас в теме
(76) Внешнюю компоненту полностью переписал, она стала универсальнее и понятнее. С Вашим файлом пока разбираюсь. Новую версию выложу на днях.
79. frkbvfnjh 385 07.03.18 14:11 Сейчас в теме
(77) В заголовке файла оказался BOM от UTF-8, если его убрать, то все распаковывается нормально.
61. Alligator84 54 24.06.17 16:56 Сейчас в теме
Автору респект.
Андрей, DT распакует?
62. frkbvfnjh 385 26.06.17 07:06 Сейчас в теме
На прямую, думаю что нет. Нужно знать формат DT файла, а я его не знаю. Если кто даст ссылки на какие-то зацепки по этому формату, то постараюсь сделать распаковщик DT-файлов...
63. German 1002 05.12.17 00:53 Сейчас в теме
64. frkbvfnjh 385 05.12.17 05:12 Сейчас в теме
Нашел исходник https://infostart.ru/public/15867/
Попробую заточить под внешнюю компоненту
81. GoodZone 9 28.05.18 10:38 Сейчас в теме +1 $m
(64) Скачал компоненту пробую проделать что-нибудь выдает "ошибка компоненты" и все. Объясню предысторию. Я получаю html страницу сжатую gzip, все это происходит на сервере, могу я Вашей компонентой распаковать её? Если уж совсем подробно: получаю HTTPОтвет.ПолучитьТелоКакСтроку(), она запакована gzip, мне нужно распаковать эту строку, чтоб получить исходный код страницы. У Вас в обработке есть команда "ПроверитьСжатиеСтрок", как отдельно Распаковка не могу понять, хотелось бы описание методов, в статье я так понял только для толстого клиента методы расписаны.
78. SerVer1C 153 07.03.18 14:06 Сейчас в теме
С появлением в платформе возможности удобной работы с двоичными данными сжимать и распаковывать Zlib, Deflate и GZip можно встроенными средствами языка 1С, используя класс для работы с zip-архивами, манупулируя заголовком zip-файла.
80. GoodZone 9 28.05.18 10:22 Сейчас в теме
(78) А можно пример как gzip строку распаковать?
82. frkbvfnjh 385 28.05.18 10:49 Сейчас в теме
(80) РаспаковатьСтроку(Строка, Истина, 2) или попробовать 2-ой параметр "Ложь"
83. GoodZone 9 28.05.18 11:03 Сейчас в теме
(82) {ВнешняяОбработка.ZLib.Форма.Форма.Форма(270)}: Ошибка при вызове метода контекста (РаспаковатьСтроку)
ОбъектAddIn.РаспаковатьСтроку(СжатаяСтрока,КодировкаANSI, АлгоритмСжатия);
по причине:
Ошибка внешней компоненты
84. frkbvfnjh 385 28.05.18 12:03 Сейчас в теме
(83) Если хотите, то можете мне отправить сжатую строку в виде файла двоичных данных, а я у себя проверю. Только не в виде текстового файла высылайте, потому, что текстовые редакторы не сохранят никогда оригинал. Получите тело ответа в виде двоичных данных и сохраните их в файл через метод "Записать".
85. GoodZone 9 28.05.18 12:18 Сейчас в теме
(84) вот пример прилагаю
Прикрепленные файлы:
test1
86. frkbvfnjh 385 29.05.18 06:22 Сейчас в теме
(85) Я посмотрел Ваш файл, так вот это не совсем строка сжатая GZIP, это архив GZIP с текстовым файлом, поэтому сначала сохраните эти двоичные данные в файл, а затем распакуйте этот файл как архив GZIP, и полученный файл уже читайте как текстовый:

ОбъектAddIn.РаспаковатьФайл("C:\test1.", "C:\test1.txt", 2);
GoodZone; +1 Ответить
87. GoodZone 9 29.05.18 07:26 Сейчас в теме
(86) Да так сработало, спасибо.
88. GoodZone 9 29.05.18 07:28 Сейчас в теме
А может кто-нибудь знает как налету распаковывать без файловых операций и желательно без компонент???
89. frkbvfnjh 385 29.05.18 08:17 Сейчас в теме
(88) Без компоненты не знаю, но с этой же компонентой можно:

ДвоичныеДанные = ОбъектAddIn.РаспаковатьДвоичныеДанные(ОтветHTTP.ПолучитьТелоКакДвоичныеДанные(), 2);
ИсходнаяСтрока = ПолучитьСтрокуИзДвоичныхДанных(ДвоичныеДанные, КодировкаТекста.UTF8);
GoodZone; +1 Ответить
Оставьте свое сообщение
Новые вопросы с вознаграждением
Автор темы объявил вознаграждение за найденный ответ, его получит тот, кто первый поможет автору.

Вакансии

Консультант-аналитик 1С
Санкт-Петербург
Полный день

Консультант-аналитик 1С
Москва
зарплата от 120 000 руб. до 120 000 руб.
Полный день

Удаленный ИТ-журналист
Санкт-Петербург
По совместительству

Программист 1С
Санкт-Петербург
зарплата от 100 000 руб.
Полный день

Программист 1С
Санкт-Петербург
зарплата от 130 000 руб. до 150 000 руб.
Полный день