Имя: Пароль:
1C
 
У кого нибудь есть готовый вариант кодирования/декодирования 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
вот кстати и картинка для тестирования ;)

http://image.bayimg.com/da/dl/pa/ab/i.jpg
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) не гыгыкал...

так что незвезди