|
как в 1с77 конвертировать файл в base64 | ☑ | ||
---|---|---|---|---|
0
vi0
17.03.15
✎
18:56
|
Коллеги, подскажите, как в 1с77 конвертировать файл в base64
|
|||
1
Torquader
17.03.15
✎
19:38
|
Или ручками через КодСимв и Симв или изучать AdoDb, чтобы понять, что оно умеет.
P.S. пишется студентом в рамках задания на одно занятие. |
|||
2
Провинциальный 1сник
17.03.15
✎
19:51
|
(1) Без "внешних костылей" не обойтись, не умеет 1с работать с байтами.. ни семерка, ни восьмерка.
|
|||
3
ДенисЧ
17.03.15
✎
19:57
|
(2) КодСимв() не спасёт отца русской?
|
|||
4
Torquader
17.03.15
✎
19:57
|
Стандартный объект Scripting.TextStream умеет.
И вызвать его можно как из семёрки, так и из восьмёрки, только есть проблема с символами с нулевым кодом, но она решаема. |
|||
5
Провинциальный 1сник
17.03.15
✎
20:01
|
(3) А вы уверены, что получится загрузить бинарник через объект Текст, чтобы дальше разбирать его посимвольно?
|
|||
6
Провинциальный 1сник
17.03.15
✎
20:03
|
(4) Это и есть костыли. В восьмерке сделали объект ДвоичныеДанные, но по непонятным причинам отказались реализовать возможность собственно работы с этими данными, аналогично со строками (получение буфера по размеру и смещению, чтение-запись байтов).. Наверное, чтобы вирусы не писали на 1с.)
|
|||
7
Jaap Vduul
17.03.15
✎
20:18
|
Если неохота заморачиваться с написанием своей функции, то самый простой способ - это через DOMDocument создать типизированный (bin.base64) xml и записать в него содержимое файла через adodb.stream, а поскольку 7,7 байтовый массив не может переваривать, то обернуть это всё безобразие в scriptControl.
|
|||
8
Torquader
17.03.15
✎
20:21
|
(6) Двоичные данные - это поле BLOB в SQL, но в SQL-сервере эти данные можно только получать и записывать - поэтому, никто не заботился о том, чтобы с ним можно было работать.
|
|||
9
Провинциальный 1сник
17.03.15
✎
20:28
|
(8) Если рассуждать так - то 1с вообще не нужна.. есть же sql-сервер, вот и пусть пользователи запросы в консоли колбасят..)
|
|||
10
Torquader
17.03.15
✎
20:52
|
(9) Я не говорю, что 1С не нужна - я просто объяснил, почему появился объект "ДвоичныеДанные".
На самом деле, не хватает объекта "НаборБайтов", чтобы с ним работать. |
|||
11
vi0
18.03.15
✎
12:13
|
Почему результат кодирования разными кодировщиками может быть разный, а раскодирование одинаковое, даже если закодированные данные передать в другой раскодировщик?
Например вот два кодировшика. Результат кодирования разный. http://secundomer.ru/index.php?r=base64/decode http://base64.ru/ Кодируемый текст: Если в процессе просмотра выбирались несколько страниц, то с помощью команд "Переход вперед" и "Переход назад" можно вернуться к просмотренным страницам. Для быстрого перехода к нужной странице следует использовать кнопки, располагающиеся справка от указанных кнопок. При щелчке мыщью на эту кнопку открывается список названий страниц, при выборе нужной сразу выполняется показ этой страницы. Если переходов (учитываются переходы именно того направления, которые соответствуют кнопке перехода) было более 9, то в списке показываются только ближайшие девять страниц, а в конце списка добавляется строка, содержащая текст "История". Полный список посещенных страниц открывается при выборе этой строки списка. |
|||
12
Torquader
18.03.15
✎
16:53
|
(11) Не забываем, что кодировка текста может быть как однобайтовая, так и двухбайтовая или, как положено в интернете - Utf-8, а Base64 получается после преобразования байтов в строку.
Поэтому, если вы видите одно и тоже как текст, то это не означает, что это будет одно и то же для компьютера. P.S. это, кстати, одна из проблем проверки электронной подписи, когда помимо записи текста нужно указывать ещё и кодировку, в которой он записан. |
|||
13
vi0
18.03.15
✎
17:00
|
(12) кажется, что тут в другом дело
если взять кодировщики из (11) то коротку строку (например слово "Если") они кодируют одинаково, а длинную, как я там привел - по разному |
|||
14
Torquader
18.03.15
✎
17:17
|
(13) Не забываем, ещё, про переводы строки (мягкие 0Dh 0Dh 0Ah и обычные 0Dh 0Ah).
|
|||
15
Torquader
18.03.15
✎
17:22
|
В частности, именно переводы строки они транслируют по-разному.
|
|||
16
vi0
18.03.15
✎
18:11
|
(15) точно, проверил - разница из за переводов строки
|
|||
17
Torquader
18.03.15
✎
18:13
|
(16) Да я уже до тебя проверил, так что знаю.
|
|||
18
FN
18.03.15
✎
23:20
|
(0)
Простое кодирование и декодирование base64 У меня где-тое есть модифкация с поддержкой кодировки файлов этой методой. Могу поискать. |
|||
19
vi0
19.03.15
✎
11:07
|
(18) быстро это работает?
|
|||
20
FN
19.03.15
✎
13:20
|
(19) терпимо.
Вот нарыл: Тут используется 1с++ для сжатия в зип исходных данных, но можно и без него //====================================================================== //Возвращает строку - результат перекодировки файла (либо имя выходного файла) по стандарту base64 или другому алгоритму. //возможные варианты: 7bit, 8bit, base64, binary, mac-binhex40, quoted-printable, uuencode //Параметр сжимать указывает что перед кодированием необходимо заархивировать файл по стандарту zip //Параметр ВозвращатьКакФайл указывает что результат нужно записать в файл с именем ВозвращатьКакФайл Функция КодироватьФайл(ФайлИсточник, Кодировка="base64",Сжимать=1,ВозвращатьКакФайл="") Экспорт ЦДО=СоздатьОбъект("CDO.Message"); Файл=ФайлИсточник; Если ФС.СуществуетФайл(Файл)=1 Тогда Если Сжимать=1 Тогда ФСО=СоздатьОбъект("Scripting.FileSystemObject"); Файл=КаталогВременныхФайлов()+ФСО.GetTempName(); Бинари=СоздатьОбъект("BinaryData"); Состояние("Сжатие данных.."); Бинари.ЗагрузитьИзФайла(ФайлИсточник,1); Бинари.СохранитьВФайл(Файл); Бинари.Закрыть(); КонецЕсли; Состояние("Кодирование данных.."); Вложение=ЦДО.AddAttachment(Файл); Вложение.ContentTransferEncoding=Кодировка; Стрим=Вложение.GetEncodedContentStream(); Иначе БодиПарт=ЦДО.BodyPart; Поля=БодиПарт.Fields; Поле=Поля.Item("urn:schemas:mailheader:content-type"); Поле.Value="text/plain; charset=""windows-1251"""; Поля.Update(); Стрим = БодиПарт.GetDecodedContentStream(); Стрим.charset = "windows-1251"; Стрим.WriteText(Файл); Стрим.Flush(); БодиПарт.ContentTransferEncoding = Кодировка; Стрим=БодиПарт.GetEncodedContentStream(); КонецЕсли; Если ВозвращатьКакФайл="" Тогда Возврат Стрим.ReadText(); Иначе Стрим.SaveToFile(ВозвращатьКакФайл); Возврат ВозвращатьКакФайл; КонецЕсли; КонецФункции //====================================================================== //Возвращает строку - расположение файла, результата раскодировки строки по стандарту base64 или другому алгоритму. //возможные варианты: 7bit, 8bit, base64, binary, mac-binhex40, quoted-printable, uuencode //Параметр распаковать указывает что после раскодировки необходимо разархивировать файл по стандарту zip //Если ФайлИсточник является файлом - то источник берется из файла, а не из СтрокаИсточник. Функция ДекодироватьФайл(СтрокаИсточник, Кодировка="base64",Распаковать=1,ФайлИсточник="") Экспорт ЦДО=СоздатьОбъект("CDO.Message"); ФСО=СоздатьОбъект("Scripting.FileSystemObject"); Файл=КаталогВременныхФайлов()+ФСО.GetTempName(); Пустышка=КаталогВременныхФайлов()+ФСО.GetTempName(); ЗначениеВФайл(Пустышка,""); Вложение=ЦДО.AddAttachment(Пустышка); Вложение.ContentTransferEncoding=Кодировка; Состояние("Декодировка данных"); Стрим=Вложение.GetEncodedContentStream(); Если ФайлИсточник="" Тогда Текст=СоздатьОбъект("Текст"); Текст.ДобавитьСтроку(СтрокаИсточник); Текст.Записать(Файл);Текст=""; Стрим.LoadFromFile(Файл); Иначе Стрим.LoadFromFile(ФайлИсточник); КонецЕсли; Стрим.Flush(); Вложение.SaveToFile(Файл); ФС.УдалитьФайл(Пустышка); Если Распаковать=1 Тогда Состояние("Распаковка данных"); Бинари=СоздатьОбъект("BinaryData"); Бинари.ЗагрузитьИзФайла(Файл,0); Бинари.СохранитьВФайл(Файл,1); Бинари.Закрыть(); КонецЕсли; Возврат Файл; КонецФункции |
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |