|
У кого нибудь есть готовый вариант кодирования/декодирования BASE64? | ☑ | ||
---|---|---|---|---|
0
Гений 1С
гуру
06.07.07
✎
13:20
|
Чтобы на входе/выходе байтовый массив файла, а на выходе/входе строка BASE64?
;-) |
|||
1
Гений 1С
гуру
06.07.07
✎
13:20
|
||||
4
Нэп
06.07.07
✎
16:37
|
Функция ПолучитьСимволПоКоду6Бит(Код)
возврат сред("ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/",Код+1,1); КонецФункции Функция Див(а,б) Возврат Цел(а/б); КонецФункции Функция Мод(а,б) Возврат (а - цел(а/б)*б); КонецФункции Функция КодироватьВСтроку6БитОдинБайт(байт) слово = байт*Pow(2,4); строка=ПолучитьСимволПоКоду6Бит(Див(слово,Pow(2,6))) + ПолучитьСимволПоКоду6Бит(Мод(слово,Pow(2,6))); возврат строка; КонецФункции Функция КодироватьВСтроку6БитДваБайта(байт1, байт2) слово =байт1*Pow(2,10) + байт2*Pow(2,2); строка=ПолучитьСимволПоКоду6Бит(див(слово,Pow(2,12))) + ПолучитьСимволПоКоду6Бит( мод( див(слово,Pow(2,6)) , Pow(2,6) ) ) + ПолучитьСимволПоКоду6Бит(мод(слово,Pow(2,6))); возврат строка; КонецФункции Функция КодироватьМассивБайтовВСтроку6Бит(массив) строка = ""; колвсего = массив.Количество(); кол = див(колвсего,3); остаток = мод(колвсего,3); Для сч = 0 по кол-1 цикл слово = массив[сч*3]*Pow(2,16) + массив[сч*3+1]*Pow(2,8) + массив[сч*3+2]; стр = ПолучитьСимволПоКоду6Бит( див(слово,Pow(2,18)) ) + ПолучитьСимволПоКоду6Бит( мод( див(слово,Pow(2,12)) , Pow(2,6) )) + ПолучитьСимволПоКоду6Бит(мод(див(слово,Pow(2,6)),Pow(2,6))) + ПолучитьСимволПоКоду6Бит( мод(слово,Pow(2,6)) ); строка = строка + стр; КонецЦикла; Если остаток = 1 Тогда строка = строка + КодироватьВСтроку6БитОдинБайт(массив[колвсего-1]); ИначеЕсли остаток = 2 тогда строка = строка + КодироватьВСтроку6БитДваБайта(массив[колвсего-2],массив[колвсего-1]); КонецЕсли; возврат строка; КонецФункции Процедура КнопкаВыполнитьНажатие(Кнопка) objHTTP = ПолучитьCOMОбъект("","Microsoft.XMLHTTP"); objHTTP.open("GET", "http://192.168.100.10/images/00_01.jpg",0,,); //третий параметр == 0 т.е. обработка синхроная //для асинхронной нужно ставить 1 и ловить событие //objHTTP.onreadystatechange objHTTP.send(); Строка = КодироватьМассивБайтовВСтроку6Бит(objHTTP.responseBody.Выгрузить()); Двоичные = Base64Значение(Строка); Двоичные.Записать("e:\test.jpg"); КонецПроцедуры p.s. можно заменить pow(2,x) на нужные числа для ускорения |
|||
5
dimzon
06.07.07
✎
19:01
|
(4)
а спорим я перепишу этот код в 5-6 строк и работать будет в разы быстрее ;) |
|||
6
romix
модератор
06.07.07
✎
19:24
|
||||
7
dimzon
06.07.07
✎
19:27
|
(4)
вот на VBScript (на 1С переведите сами): function toBase64(safeArray) dim helper set helper = CreateObject("MSXML2.DomDocument.3.0").createElement("a") helper.DataType = "bin.base64" helper.nodeTypedValue = safeArray toBase64 = helper.text end function естественно оптимальнее создать и проинициализировать объект helper 1 раз... тогда процедура преобразования занимает вообще 2 строки: function toBase64(safeArray) helper.nodeTypedValue = safeArray toBase64 = helper.text end function производительность лучше мерить на картинке от 1 мегабайта размером... разница будет заметна невооружённым взглядом ;) вопрос на "5" - почему ;) |
|||
8
dimzon
06.07.07
✎
19:37
|
(6) не может работать с БОЛЬШИМИ объёмами (более 255 байт) без создания промежуточного файла, что не есть гут...
|
|||
9
romix
модератор
06.07.07
✎
20:21
|
(8) Я не люблю память нагружать... Все равно ведь все кешируется...
|
|||
10
dimzon
06.07.07
✎
21:10
|
(8) Ну так OS обычно это делает эффективнее...
|
|||
11
dimzon
06.07.07
✎
21:11
|
(9) Ну так OS обычно это делает эффективнее...
|
|||
12
Гений 1С
гуру
06.07.07
✎
21:17
|
(7) Димзон, мы для того и делаем функции на языке 1С, чтобы обходиться без всяких внешних компонент по возможности. ;-)
(4) Большое нечеловеческое спасибо НЭП, надеюсь ты тестировал? ;-) |
|||
13
Гений 1С
гуру
06.07.07
✎
21:18
|
(6) зачем нужна ВК, если можно без ВК. ;-)
|
|||
14
Гений 1С
гуру
06.07.07
✎
21:19
|
(6) ромикс, а сколько возьмешь за компоненту для доступа к контактам, задачам, заметкам в КПК через ActiveSync???
|
|||
15
Vovik
07.07.07
✎
01:07
|
(0)На семере есть, писал в свое время. http://moy1c.narod.ru/Downloads/base_64.rar
|
|||
16
Vovik
07.07.07
✎
01:09
|
+15 Сори. Там только в одну сторону. Строка-строка в BASE64/ f j,hfnyj ytne
|
|||
17
dimzon
07.07.07
✎
04:03
|
(12)
Ты сначала скорость сравни на больших картинках, потом говори ;) а MSXML практически везде стоит :) |
|||
18
dimzon
07.07.07
✎
04:08
|
(12)
тем более в своём "браузере на 1С" итак используешь COM-объекты в большом количестве... |
|||
19
Гений 1С
гуру
07.07.07
✎
09:27
|
(17) ну и какая будет разница на картинке в 1МБ? гыгыгыгы... Больше картинок на веб-паги не размещают.
|
|||
20
smaharbA
07.07.07
✎
10:38
|
Непонял, нафига базе64 ? для совместимости ?
есть более экономный аски85 |
|||
21
Гений 1С
гуру
07.07.07
✎
12:11
|
(20) Потому что 1С умеет ДвоичныеДанные конструировать только из base64
|
|||
22
Sonic
07.07.07
✎
12:16
|
(14) для БЕ300 писал чтобы доступ был непосредстевенно из 1С, актив синк не обязательно должен быть установлен
|
|||
23
dimzon
07.07.07
✎
12:52
|
(19) А ты перед тем как гыгыкать попробуй на 1 мегабайтной картинке ;) Большая будет разница
|
|||
24
Гений 1С
гуру
07.07.07
✎
16:10
|
(23) мегабайтная картинка - это миллион прогонов, фигня.
|
|||
25
dimzon
07.07.07
✎
18:15
|
(23) ты как всегда - сплошной трёп ;)
вот сравни и посмотри... |
|||
26
dimzon
07.07.07
✎
18:15
|
блин, всё время путаюсь
(24) ты как всегда - сплошной трёп ;) вот сравни и посмотри... |
|||
27
dimzon
08.07.07
✎
19:41
|
(24) а вообще ты как всегда вот этим своим постом про "фигню" продемонстрировал свою некомпетентность...
|
|||
28
Нэп
08.07.07
✎
20:27
|
(12)
Да. Это рабочий пример |
|||
29
dimzon
08.07.07
✎
20:39
|
(28) Нэп, а ты что про производительность скажешь? На 1 мегабайте афигительно заметно ;) Угадаешь в чём узкое место твоего кода?
|
|||
30
Гений 1С
гуру
08.07.07
✎
21:21
|
(28) Спасибо
(29) Хорош флудить. В 1С немного другие подходы. |
|||
31
dimzon
08.07.07
✎
21:29
|
(29) А в чём флуд? Я просто заявляю что код Нэпа весьма неоптимален. И это будет ОЧЕНЬ заметно на мегабайтной картинке. Или в 1С принято писать априори тормозной код? Гыгыгы...
|
|||
32
Sol78
08.07.07
✎
23:15
|
Хорош флудить. В 1С немного другие подходы.
А в эти подходы, метод Base64Строка()не входит? Ну и обратный метод, соответственно, Base64Значение(). |
|||
33
dimzon
08.07.07
✎
23:16
|
(4)
самое забавное что на AMD Athlon XP 2900+ этот код будет обрабатывать мегабайтный массив НЕ МЕНЕЕ 5 (ПЯТИ) минут !!! |
|||
34
dimzon
08.07.07
✎
23:20
|
(32) насколько я понимаю проблема растёт из невозможности прямого преобразования из COM SafeArray в ДвоичныеДанные
поэтому Гений предполагает использования цепочки SafeArray->Base64->ДвоичныеДанные Но ещё раз повторяю что приведённый в (4) код КРАЙНЕ НЕЭФФЕКТИВЕН! Кто первый догадается почему? |
|||
35
Нэп
09.07.07
✎
08:51
|
(34)
Если ты про умножения на степень двойки, вместо сдвига - так это никак не обойти. |
|||
36
dimzon
09.07.07
✎
11:47
|
(35)
Неа, я не про умножение ;) Есть ещё варианты? Гений, а ты чего затих? Ты же Гений! |
|||
37
dimzon
09.07.07
✎
11:57
|
завёл отдельную темку по производительности ;)
Простенькая задачка по производительности |
|||
38
dimzon
09.07.07
✎
16:44
|
||||
39
dimzon
09.07.07
✎
18:10
|
(35),(24) для мегабайтной картинки имеем примерно 333333 проходов цикла ;)
предлагаю замерить время, необходимое на выполнение такого фрагмента кода: строка = ""; Для сч = 0 по 333333 цикл строка = строка + "abcd"; КонецЦикла; будете удивлены, гыгыгы... |
|||
40
Гений 1С
гуру
10.07.07
✎
09:55
|
(39) Окей, в свою библиотеку функций включу твой вариант записи COMSAFEARRAY в файл.
|
|||
41
dimzon
10.07.07
✎
13:10
|
(40) Если тебе надо COMSAFEARRAY именно в ФАЙЛ то лучше наверно сразу через ADODB.Stream сохранять, без этого "онанизма" с base64
И на будущее - перед тем как гыгыкать - слушай что тебе люди знающие говорят ;) |
|||
42
dimzon
10.07.07
✎
13:23
|
(40) и вот те напоминание про твой пост
http://sql.ru/forum/actualthread.aspx?tid=406760&pg=-1#3980648 "И не рассуждайте пожалуйста про конкатенацию строк - для 1С это стандартный метод и он, уж поверьте, оптимизирован на уровне движка. ;-) Не позорьтесь." так что позор тебе, неуч... |
|||
43
Гений 1С
гуру
10.07.07
✎
18:03
|
(42) димзон, по моему ты не там роешь. Ну в общем, тебе не понять.
Ты думаешь, что открыл мне америку своим Адостримом, гыгыгы... Просто 1сники пытаются по возможности обходиться штатными средствами. И в этом есть свой резон. Ну это приходит с опытом. |
|||
44
dimzon
10.07.07
✎
18:29
|
(43) можешь гыгыкать сколько хочешь но если тебе сохранять файл на диск то через Адострим эффективнее...
а насчёт америки - если бы ты знал ты бы в (19) не гыгыкал... так что незвезди |
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |