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

0. Андрей Лукин (frkbvfnjh) 320 12.03.16 11:59 Сейчас в теме
Внешняя Native компонента для сжатия/распаковки файлов по алгоритму Deflate и для создания/распаковки архивов в формате GZip

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

Комментарии
1. Сергей Рудаков (fishca) 1089 15.03.16 12:38 Сейчас в теме
Исходники компоненты будут?
3. Андрей Лукин (frkbvfnjh) 320 15.03.16 13:49 Сейчас в теме
(1) fishca, нет, исходники пока выкладывать не буду :(
6. Сергей Рудаков (fishca) 1089 15.03.16 16:28 Сейчас в теме
(3) компонента писана на С++ или ???
8. Андрей Лукин (frkbvfnjh) 320 15.03.16 18:05 Сейчас в теме
(6) fishca, компонента написана на Delphi
2. Никита Грызлов (nixel) 350 15.03.16 12:53 Сейчас в теме
Добро пожаловать в клуб "Yet another unpack"
Скорость работы с тем же zlib сравнивали? Есть прирост?
4. Андрей Лукин (frkbvfnjh) 320 15.03.16 13:51 Сейчас в теме
(2) nixel, нет скорость не замерял, не думаю, что есть существенная разница
5. Алексей Шачнев (saa@kuzov.org) 15.03.16 15:03 Сейчас в теме
В типовом примере ВК на ИТС показано, как передавать двоичные данные из ВК в 1С.
7. Андрей Лукин (frkbvfnjh) 320 15.03.16 18:05 Сейчас в теме
(5) saa@kuzov.org, оооо, спасибо, гляну, попробую разобраться
9. biformatus (biformatus) 15.03.16 21:56 Сейчас в теме
12. Андрей Лукин (frkbvfnjh) 320 16.03.16 06:19 Сейчас в теме
(9) biformatus, я не знаю, что это за зверь efd, вернее не знаю как устроен этот формат, но обработкой он распаковался, правда что дальше делать с этим файлом, не понятно, видимо нужно знать формат распакованного efd.
13. Сергей Боровик (BorovikSV) 1129 16.03.16 07:13 Сейчас в теме
15. Андрей Лукин (frkbvfnjh) 320 16.03.16 09:12 Сейчас в теме
(13) BorovikSV, да, спасибо, я тоже нарыл эту публикацию, но сам формат файла там не обсуждался :(
10. Алекс zhu4 (Arxxximed) 8 16.03.16 00:27 Сейчас в теме
Так это же круто))) можно наконец сжатый http ответ дешифровывать . Или не получиться на лету?
11. Андрей Лукин (frkbvfnjh) 320 16.03.16 06:00 Сейчас в теме
(10) Arxxximed, со сжатым http-ответом не работал, не знаю как там чего устроено, но если он приходит в виде сжатой строки в BASE64, то по крайней мере можно попробовать.
18. Сергей Смирнов (Serginio) 668 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) 135 16.03.16 08:50 Сейчас в теме
Двоичные данные это VTYPE_BLOB.
function TV8UserObject.V8SetBlob(V: PV8Variant; Value: PByte;
Length: integer): boolean;
16. Андрей Лукин (frkbvfnjh) 320 16.03.16 10:50 Сейчас в теме
(14) v77, да, большое спасибо, кажись это оно! Попробую допилить...
17. Игорь Steelvan (Steelvan) 31 16.03.16 13:15 Сейчас в теме
Надо добавить возможность шифрования паролем, тогда можно получить симметричное шифрование без использования диска (сейчас нужен диск при использовании ZIP пароля).
19. Леонид Павлиенко (PLAstic) 189 16.03.16 17:16 Сейчас в теме
В папке лежит архив формата gzip с одним файлом внутри. Пытаюсь извлечь файл с помощью РаспаковатьФайл. Спустя ожидание от 2 секунд до 5 минут задумчивости вылетает приятное окно с информированием, что "работа была завершена, перезапустить или завершить работу". Перезапуск не помогает, файл не распаковывается.
Проблема же метода РаспаковатьФайлGZip в том, что под него надо создавать папку из-за проблем с определением имени файла в архиве. Ну создали мы папку, есть на это СоздатьКаталог(). А удалить потом за собой чем?
Сделай функцию, возвращающую массив имён файлов внутри архива и возможность извлечения файла по имени.

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

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

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

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

Тип: Строка.
Маска для выбора удаляемых файлов.
Если <Маска> не указана, то удаляются все файлы и каталог <Путь>.
24. Леонид Павлиенко (PLAstic) 189 22.03.16 11:24 Сейчас в теме
(22) изучал недавно, но пропустил последнюю строку. Спасибо.
23. Андрей Лукин (frkbvfnjh) 320 21.03.16 11:11 Сейчас в теме
(21) PLAstic, кстати, я обновил публикацию и добавил новые методы, перечитайте публикацию
25. c+ + (ture) 231 19.04.16 18:57 Сейчас в теме
Обрати свой взор на конфиг 1С8 хранящийся на sql. Ты его можешь читать и парсить теперь.
Собственно есть ссылка и имя объекта, надо вынуть УФ форму из соседней базы и нарисовать ее в текущей базе 1С (с представлениями на месте реквизитов объекта).
26. Андрей Лукин (frkbvfnjh) 320 20.04.16 05:54 Сейчас в теме
(25) ture, А что такое
конфиг 1С8 хранящийся на sql?
Не совсем понимаю о чем речь, может ссылки по теме дадите...
27. Дмитрий Семенов (Sam13) 229 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) 320 18.05.16 15:29 Сейчас в теме
(27) Sam13, ща попробую помочь...
29. Сергей Смирнов (Serginio) 668 18.05.16 16:46 Сейчас в теме
30. Дмитрий Семенов (Sam13) 229 19.05.16 09:58 Сейчас в теме
(29) Serginio, спасибо, почти получилось.
Но я не понял все-таки как сделать deflate твоим (http://www.forum.mista.ru/topic.php?id=765672#61) способом.
Хелпани, плиз.
31. Сергей Смирнов (Serginio) 668 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) 668 19.05.16 10:53 Сейчас в теме
Для Deflate нужно использовать System.IO.Compression.DeflateStream

Заменить на

zipStr = врап.СоздатьОбъект("System.IO.Compression.DeflateStream", СжатыйПоток, CompressionMode.Compress);
33. Дмитрий Семенов (Sam13) 229 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) 668 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) 229 19.05.16 17:08 Сейчас в теме
Круто, спасибо. Я даже немножко что-то понял.
Только как это в мой код 1С сунуть?
36. Андрей Лукин (frkbvfnjh) 320 20.05.16 07:19 Сейчас в теме
(35) Sam13, кажется я решил Вашу проблему. Если еще интересует могу компоненту допилить под Вас. Дело в том, что Deflate не так прост как кажется... На самом деле вариантов сжатия методом Deflate не меренное множество и в Вашем случае как раз используется самый простой, а я в компоненте использовал алгоритм который использует 1С в формате своих файлов. У меня получилось и сжать и распаковать Ваш xml, все хэш суммы совпали.
37. Дмитрий Семенов (Sam13) 229 20.05.16 09:14 Сейчас в теме
(36) буду очень признателен.
Думаю, что это будет полезно многим, т.к. сейчас сбер многих переводит на печатную форму со штрихкодами. Но для формирования предлагает свой софт.
Неудобно пользоваться еще одной программой, когда уже есть база 1С.
38. Андрей Лукин (frkbvfnjh) 320 20.05.16 13:03 Сейчас в теме
(37) Sam13, Обработку с новой компонентой выслал Вам на почту. Проблема оказалась куда глубже чем просто алгоритм сжатия. Дело в том, что в Вашем примере текст должен быть именно в кодировке ANSI, а из 1С, строки можно передать только в уникоде, поэтому помимо смены алгоритма сжатия еще пришлось предварительно менять кодировку строк с UTF8 в ANSI, но в итоге все отработало как надо. В дальнейшем возможно обновлю публикацию и для каждой функции по сжатию строк добавлю аналоги с постфиксом "ANSI" и добавлю функции со стандартным алгоритмом Deflate. Надеюсь помог.
40. Дмитрий Шевченко (dshevchenko) 20.05.16 14:16 Сейчас в теме
(38) а можете выслать и мне исправленный вариант? У меня та же проблема, заморочки со Сбербанком.
41. Андрей Лукин (frkbvfnjh) 320 20.05.16 15:04 Сейчас в теме
(40) dshevchenko, хорошо, скиньте почту
42. Дмитрий Шевченко (dshevchenko) 20.05.16 15:50 Сейчас в теме
(41) в профиле, d.shevchenko@pokupochka.ru , заранее спасибо.
39. Андрей Лукин (frkbvfnjh) 320 20.05.16 13:10 Сейчас в теме
(37) Sam13, кстати если работаете в управляемом приложении то перед тестирование предварительно удалите файлы из каталога %APPDATA%\1C\1Cv8\ExtCompT, по крайней мере удалите файл Arc1C.dll, а то 1С будет упорно использовать старую версию...
43. Сергей Смирнов (Serginio) 668 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) 320 23.05.16 11:13 Сейчас в теме
(44) dshevchenko, спасибо за ответ. Тогда скоро обновлю публикацию...
46. Дмитрий Семенов (Sam13) 229 23.05.16 16:21 Сейчас в теме
Подтверждаю, все работает. Большое спасибо.
Сбер принял штрихкод.
Постараюсь сделать публикацию по формированию ШК
frkbvfnjh; +1 Ответить
48. Андрей Лукин (frkbvfnjh) 320 24.05.16 02:25 Сейчас в теме
49. Андрей Лукин (frkbvfnjh) 320 24.05.16 05:37 Сейчас в теме
(46) Sam13, обновил публикацию. Можете заново скачать обработку, в новой версии исправил проблемы с кириллицей.
47. Сергей Смирнов (Serginio) 668 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) 320 10.10.16 05:50 Сейчас в теме
(50) vit-vas, странно, в теории должно работать... Как проверю, отпишусь, по возможности исправлю.
54. Виталий Васильев (vit-vas) 07.11.16 00:25 Сейчас в теме
55. Андрей Лукин (frkbvfnjh) 320 07.11.16 11:34 Сейчас в теме
(54) vit-vas, какая ошибка выходит? Теоретически должно все работать, у меня нет возможности проверить, т.к. нет 64-го сервера 1С.
58. Андрей Лукин (frkbvfnjh) 320 25.01.17 08:59 Сейчас в теме
65. Антон Александрович (user894822) 16.02.18 12:42 Сейчас в теме
(58) На 64 бит сервере не работает. Пытаюсь выполнить РаспаковатьСтрокуBase64 в фоновом процессе. Что происходит, непонятно, но что-то настолько плохое, что даже блок Попытка-Исключение это не ловит, процесс просто аварийно завершается.
52. biformatus (biformatus) 19.10.16 23:03 Сейчас в теме
53. Андрей Лукин (frkbvfnjh) 320 20.10.16 06:25 Сейчас в теме
(52) biformatus, дайте формат efd, я сделаю... Я нигде не нашел описания формата. На инфостарте есть плагин для тотал коммандера, но автор то исходник не даст и формат не расскажет, а реверсингом нет ни желания, ни времени, ни опыта заниматься..
56. Сергей Смирнов (Serginio) 668 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) 320 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 Сейчас в теме
61. Олег (Alligator84) 24.06.17 16:56 Сейчас в теме
Автору респект.
Андрей, DT распакует?
62. Андрей Лукин (frkbvfnjh) 320 26.06.17 07:06 Сейчас в теме
На прямую, думаю что нет. Нужно знать формат DT файла, а я его не знаю. Если кто даст ссылки на какие-то зацепки по этому формату, то постараюсь сделать распаковщик DT-файлов...
63. Герман (German) 938 05.12.17 00:53 Сейчас в теме
64. Андрей Лукин (frkbvfnjh) 320 05.12.17 05:12 Сейчас в теме
Нашел исходник https://infostart.ru/public/15867/
Попробую заточить под внешнюю компоненту
Оставьте свое сообщение