Скорая Компьютерная Помощь г. Калуга

Полный спектр компьютерных услуг!

Здравствуйте, гость ( Вход | Регистрация )

> Внимание!

  • Вся информация, расположенная в данном и других разделах форума получена из открытых источников (интернет-ресурсы, средства массовой информации, печатные издания и т.п.) и/или добавлена самими пользователями. Администрация форума предоставляет его участникам площадку для общения / размещения файлов / статей и т.п. и не несет ответственности за содержание сообщений, а также за возможное нарушение авторских, смежных и каких-либо иных прав, которое может повлечь за собой информация, содержащаяся в сообщениях.
Ремонт компьютеров в калуге Рекламное место сдается
 
Ответить в эту темуОткрыть новую тему
> Декодирование Base64 на 1С 7.7, Процедура из типовой бюджетной конфигурации
Decker
сообщение 25.2.2013, 2:05
Сообщение #1


Администратор
*****

Группа: Главные администраторы
Сообщений: 14349
Регистрация: 12.10.2007
Из: Twilight Zone
Пользователь №: 1



Небольшая процедура на 1С 7.7 для декодирования Base64, взята из типовой бюджетной конфигурации:

Код
//******************************************************************************
// ДекодироватьBase64(Текст64)
//
Функция ДекодироватьBase64(Текст64)
    Перем Алфавит;
    Перем Группа, Символ;
    Перем Значение, Разряд;
    Перем Символ6, Значение6;
    Перем Значение8, Символ8;
    Перем Текст;
    
    // Подготовка алфавита и результата
    Алфавит = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=";
    Текст = "";
    
    // Получение групп по 4 значащих символа
    Группа = "";
    Для Номер = 1 По СтрДлина(Текст64) Цикл
        Символ = Сред(Текст64, Номер, 1);
        Если Найти(Алфавит, Символ) = 0 Тогда
            Продолжить;
        КонецЕсли;
        Группа = Группа + Символ;
        Если СтрДлина(Группа) = 4 Тогда

            // Получение числового значения из 4-х символов
            Значение = 0;
            Разряд = 3;
            Пока Разряд >= 0 Цикл
                Символ6 = Сред(Группа, 4 - Разряд, 1);
                Если Символ6 = "=" Тогда
                    Значение6 = 0;
                Иначе
                    Значение6 = Найти(Алфавит, Символ6) - 1;
                КонецЕсли;
                Если Разряд = 1 Тогда
                    Значение6 = Значение6 * 64;
                ИначеЕсли Разряд = 2 Тогда
                    Значение6 = Значение6 * 64 * 64;
                ИначеЕсли Разряд = 3 Тогда
                    Значение6 = Значение6 * 64 * 64 * 64;
                КонецЕсли;
                Значение = Значение + Значение6;
                Разряд = Разряд - 1;
            КонецЦикла;

            // Получение 3-х символов из числового значения            
            Разряд = 2;
            Пока Разряд >= 0 Цикл
                Значение8 = Значение;
                Если Разряд = 2 Тогда
                    Значение8 = Цел(Значение8 / 256 / 256);
                    Значение = Значение - Значение8 * 256 * 256;
                ИначеЕсли Разряд = 1 Тогда
                    Значение8 = Цел(Значение8 / 256);
                    Значение = Значение - Значение8 * 256;
                КонецЕсли;
                Если Значение8 = 0 Тогда
                    Значение8 = 32;
                КонецЕсли;
                Символ8 = Симв(Значение8);
                Текст = Текст + Символ8;
                Разряд = Разряд - 1;
            КонецЦикла;
            
            Группа = "";
        КонецЕсли;
    КонецЦикла;
    
    Возврат Текст;
    
КонецФункции // ДекодироватьBase64()


Для Base64 кодирования есть vb script:

Код
Function Base64Encode(inData)
  rfc1521
  2001 Antonin Foller, Motobit Software, http://Motobit.cz
  Const Base64 = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/"
  Dim cOut, sOut, I
  
  For each group of 3 bytes
  For I = 1 To Len(inData) Step 3
    Dim nGroup, pOut, sGroup
    
    Create one long from this 3 bytes.
    nGroup = &H10000 * Asc(Mid(inData, I, 1)) + _
      &H100 * MyASC(Mid(inData, I + 1, 1)) + MyASC(Mid(inData, I + 2, 1))
    
    Oct splits the long To 8 groups with 3 bits
    nGroup = Oct(nGroup)
    
    Add leading zeros
    nGroup = String(8 - Len(nGroup), "0") & nGroup
    
    Convert To base64
    pOut = Mid(Base64, CLng("&o" & Mid(nGroup, 1, 2)) + 1, 1) + _
      Mid(Base64, CLng("&o" & Mid(nGroup, 3, 2)) + 1, 1) + _
      Mid(Base64, CLng("&o" & Mid(nGroup, 5, 2)) + 1, 1) + _
      Mid(Base64, CLng("&o" & Mid(nGroup, 7, 2)) + 1, 1)
    
    Add the part To OutPut string
    sOut = sOut + pOut
    
    Add a new line For Each 76 chars In dest (76*3/4 = 57)
    If (I + 2) Mod 57 = 0 Then sOut = sOut + vbCrLf
  Next
  Select Case Len(inData) Mod 3
    Case 1: 8 bit final
      sOut = Left(sOut, Len(sOut) - 2) + "=="
    Case 2: 16 bit final
      sOut = Left(sOut, Len(sOut) - 1) + "="
  End Select
  Base64Encode = sOut
End Function

Function MyASC(OneChar)
  If OneChar = "" Then MyASC = 0 Else MyASC = Asc(OneChar)
End Function


Однако перенести его на 1С 7.7 пока не было времени.

p.s. Для операций с Base64 на 1С 7.7 удобно использовать внешнюю компоненту (ВК) с сайта http://x-romix.narod.ru/ - Прикрепленный файл  vk_Base64.rar ( 63,35 килобайт ) Кол-во скачиваний: 331


--------------------

Вернуться в начало страницы
 
+Ответить с цитированием данного сообщения
Decker
сообщение 25.2.2013, 2:13
Сообщение #2


Администратор
*****

Группа: Главные администраторы
Сообщений: 14349
Регистрация: 12.10.2007
Из: Twilight Zone
Пользователь №: 1



Еще один простой способ кодирования / декодирования Base64 на 1С:

(с) http://www.forum.mista.ru/topic.php?id=604862, smaharbA

Код
Функция Кодировать(Стр, Кодировка)
    ЦДО=СоздатьОбъект("CDO.Message");
    БодиПарт=ЦДО.BodyPart;
    Поля=БодиПарт.Fields;
    Поле=Поля.Item("urn:schemas:mailheader:content-type");
    Поле.Value="text/plain; charset=""windows-1251""";
    Поля.Update();
    Стрим = БодиПарт.GetDecodedContentStream();
    Стрим.charset = "windows-1251";
    Стрим.WriteText(Стр);
    Стрим.Flush();
    БодиПарт.ContentTransferEncoding = Кодировка;
    Стрим=БодиПарт.GetEncodedContentStream();
    Возврат Стрим.ReadText();
КонецФункции    // Кодировать64(Стр)


Функция Декодировать(Стр, Кодировка)
    ЦДО=СоздатьОбъект("CDO.Message");
    БодиПарт=ЦДО.BodyPart;
    БодиПарт.ContentTransferEncoding = Кодировка;
    Стрим=БодиПарт.GetEncodedContentStream();
    Поля=БодиПарт.Fields;
    Поле=Поля.Item("urn:schemas:mailheader:content-type");
    Поле.Value="text/plain; charset=""windows-1251""";
    Поля.Update();
    Стрим.WriteText(Стр);
    Стрим.Flush();
    Стрим = БодиПарт.GetDecodedContentStream();
    Стрим.charset = "windows-1251";
    Возврат Стрим.ReadText();
КонецФункции    // Декодировать64(Стр)

//*******************************************

Процедура Сформировать()
    Кодировка = "base64";
    Стр=Кодировать("Вася Пупкин",Кодировка);
    Сообщить(Стр);
    Сообщить(Декодировать(Стр,Кодировка));

    Кодировка = "quoted-printable";
    Стр=Кодировать("Вася Пупкин",Кодировка);
    Сообщить(Стр);
    Сообщить(Декодировать(Стр,Кодировка));
КонецПроцедуры


--------------------

Вернуться в начало страницы
 
+Ответить с цитированием данного сообщения
Decker
сообщение 25.2.2013, 3:25
Сообщение #3


Администратор
*****

Группа: Главные администраторы
Сообщений: 14349
Регистрация: 12.10.2007
Из: Twilight Zone
Пользователь №: 1



http://ru.wikipedia.org/wiki/Base64 - Википедия про Base64.

Исправленная процедура ДекодироватьBase64 (в изначальном варианте процедура добавляла лишние пробелы в конце декодированной строки в некоторых случаях), а также процедура КодироватьBase64 на 1С 7.7:

Код
//******************************************************************************
// ДекодироватьBase64(Текст64)
//
Функция ДекодироватьBase64(Текст64)
    Перем Алфавит;
    Перем Группа, Символ;
    Перем Значение, Разряд;
    Перем Символ6, Значение6;
    Перем Значение8, Символ8;
    Перем Текст;
    
    // Подготовка алфавита и результата
    Алфавит = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=";
    Текст = "";
    
    // Получение групп по 4 значащих символа
    Группа = "";
    Для Номер = 1 По СтрДлина(Текст64) Цикл
        Символ = Сред(Текст64, Номер, 1);
        Если Найти(Алфавит, Символ) = 0 Тогда
            Продолжить;
        КонецЕсли;
        Группа = Группа + Символ;
        Если СтрДлина(Группа) = 4 Тогда

            // Получение числового значения из 4-х символов
            Значение = 0;
            Разряд = 3;
            Пока Разряд >= 0 Цикл
                Символ6 = Сред(Группа, 4 - Разряд, 1);
                Если Символ6 = "=" Тогда
                    Значение6 = 0;
                Иначе
                    Значение6 = Найти(Алфавит, Символ6) - 1;
                КонецЕсли;
                Если Разряд = 1 Тогда
                    Значение6 = Значение6 * 64;
                ИначеЕсли Разряд = 2 Тогда
                    Значение6 = Значение6 * 64 * 64;
                ИначеЕсли Разряд = 3 Тогда
                    Значение6 = Значение6 * 64 * 64 * 64;
                КонецЕсли;
                Значение = Значение + Значение6;
                Разряд = Разряд - 1;
            КонецЦикла;

            // Получение 3-х символов из числового значения            
            Разряд = 2;
            Пока Разряд >= 0 Цикл
                Значение8 = Значение;
                Если Разряд = 2 Тогда
                    Значение8 = Цел(Значение8 / 256 / 256);
                    Значение = Значение - Значение8 * 256 * 256;
                ИначеЕсли Разряд = 1 Тогда
                    Значение8 = Цел(Значение8 / 256);
                    Значение = Значение - Значение8 * 256;
                КонецЕсли;
                
                Если Значение8 <>  0 Тогда // [+] Decker
                    // чтобы не добавлялись лишние символы пробела
                    Символ8 = Симв(Значение8);
                    Текст = Текст + Символ8;
                КонецЕсли;
                
                Разряд = Разряд - 1;
            КонецЦикла;
            
            Группа = "";
        КонецЕсли;
    КонецЦикла;
    
    Возврат Текст;
    
КонецФункции // ДекодироватьBase64()

//*******************************************


Функция КодироватьBase64(Текст) // (с) Decker
    Перем Алфавит;
    Перем Группа, Символ;
    Перем Значение, Разряд;
    Перем Символ6, Значение6;
    Перем Значение8, Символ8;
    Перем Текст64;
    
    // Подготовка алфавита и результата
    Алфавит = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=";
    Текст64 = "";
          
    Группа = "";
    Для Номер=1 По СтрДлина(Текст) Цикл
    
    Символ = Сред(Текст, Номер, 1);
    Группа = Группа + Символ;
    
    Если ((СтрДлина(Группа) = 3) или (Номер = СтрДлина(Текст))) Тогда
        
        // Получение числового значения из 3-х символов
            Значение = 0;
            Разряд = 2;
            Пока Разряд >= 0 Цикл
                Символ8 = Сред(Группа, 3 - Разряд, 1);
                Значение8 = КодСимв(Символ8);
                Если Разряд = 1 Тогда
                    Значение8 = Значение8 * 256;
                ИначеЕсли Разряд = 2 Тогда
                    Значение8 = Значение8 * 256 * 256;
                КонецЕсли;
                Значение = Значение + Значение8;
                Разряд = Разряд - 1;
            КонецЦикла;
            
        // Получение 4-х символов из числового значения    
            Разряд = 3;
            Пока Разряд >= 0 Цикл
                Значение6 = Значение;
                Если Разряд = 3 Тогда
                    Значение6 = Цел(Значение6 / 64 / 64 / 64);
                    Значение = Значение - Значение6 * 64 * 64 * 64;
                ИначеЕсли Разряд = 2 Тогда
                    Значение6 = Цел(Значение6 / 64 / 64);
                    Значение = Значение - Значение6 * 64 * 64;
                ИначеЕсли Разряд = 1 Тогда
                    Значение6 = Цел(Значение6 / 64);
                    Значение = Значение - Значение6 * 64;
                КонецЕсли;      
                
                Если СтрДлина(Группа) < 3 Тогда
                    Если Значение6 = 0 Тогда
                        Значение6 = 64;
                    КонецЕсли;
                КонецЕсли;

                Символ6 = Сред(Алфавит, Значение6+1,1);
                Текст64 = Текст64 + Символ6;
                Разряд = Разряд - 1;
            КонецЦикла;    
                        
        Группа = "";    
        КонецЕсли;
    КонецЦикла;  
    
    Возврат Текст64;
    
КонецФункции // КодироватьBase64()


--------------------

Вернуться в начало страницы
 
+Ответить с цитированием данного сообщения

Ответить в эту темуОткрыть новую тему
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 

Рекламное место сдается Рекламное место сдается
Текстовая версия Сейчас: 14.3.2025, 22:56
Рейтинг@Mail.ru
Яндекс.Метрика Яндекс цитирования