![]() |
Здравствуйте, гость ( Вход | Регистрация )
![]() ![]() |
![]() |
![]()
Сообщение
#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/ - ![]() -------------------- |
|
|
![]()
Сообщение
#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"; Стр=Кодировать("Вася Пупкин",Кодировка); Сообщить(Стр); Сообщить(Декодировать(Стр,Кодировка)); КонецПроцедуры -------------------- |
|
|
![]()
Сообщение
#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() -------------------- |
|
|
![]() ![]() |
Текстовая версия | Сейчас: 14.3.2025, 22:56 | |
|