ван Гобсек Жан-Эстер

23
Рейтинг

Гобсек
Жан-Эстер ван Гобсек



  •   Регистрация: 05.06.2009 (14 лет назад)

  •   Был(а) на сайте: 23.09.2020

Подписчики 2

Рейтинг 23

Двоичные данные и кодировка Base64 в 1С 8.Х

Статья Программист Платформа 1С v8.3 Windows Бесплатно (free) Нет файла Универсальные функции

Как преобразовать строку, закодированную при помощи алгоритма Base64, в массив байтов и обратно

22.01.2014    67363    Гобсек    33       

23

Комментарии

DevПечать QR кодов для 1С:Бухгалтерия 2.0 для платежек Сбербанка#18 10.07.17 6:48
(16) + Добавил строку
ОбластьШапка1.Рисунки.КартинкаШК.Объект.code_page = 1251;
И все заработало!
Сайт http://sbqr.ru/validator/index.html признал QR код корректным.
Если работа идет на управляемых формах, то в настройках запуска к конфигурации указываем - "Толстый клиент".
Если найду способ запустить под тонким клиентом, то отпишусь.
DevПечать QR кодов для 1С:Бухгалтерия 2.0 для платежек Сбербанка#16 09.07.17 15:47
(1)Столкнулся с аналогичной проблемой. Если запустить толстый клиент (управляемое приложение), то печатная форма формируется.
При этом кодировка UTF-8 отображается корректно, а WIN1251 - нет. Та же проблема, что и у фирменной компоненты КомпонентаПечатиQRКода от 1С
Но КомпонентаПечатиQRКода от 1С хотя бы не подвисает.
DevДвоичные данные и кодировка Base64 в 1С 8.Х#19 22.01.14 13:36
(18)Зато никаких внешних компонент и тому подобное. Не нужно держать в голове, что на данном компьютере должно быть установлено для нормальной работы.
Длина подписи постоянна. Но нужно проверить, она есть или ее нету.
DevДвоичные данные и кодировка Base64 в 1С 8.Х#17 22.01.14 13:24
(15)Я статью уже исправил. Теперь вроде все нормально. Код процедуры можно взять из статьи.
DevДвоичные данные и кодировка Base64 в 1С 8.Х#16 22.01.14 13:21
(14)Чтобы проанализировать заголовок DBF файла.
DevДвоичные данные и кодировка Base64 в 1С 8.Х#13 22.01.14 12:44
(11)Практическая задача: банк присылает файлы *.DBF Их содержимое нужно загружать в 1С. Для того, чтобы стандартно обработать файл при помощи объекта XBASE, нужно сначала снять электронную подпись. Программное обеспечение для электронных подписей на данном компьютере ставить не планируется. Делаем так. Из заголовка файла узнаем какая у него должна быть длина. Если фактическая длина больше на заданное число байт, то конец файла обрезаем. Для реализации схемы нужно работать с двоичными данными. Все достаточно просто. Вопрос возник только с перекодировкой Base64 туда и обратно.
DevДвоичные данные и кодировка Base64 в 1С 8.Х#12 22.01.14 12:36
Статью переделал. Теперь вроде все нормально.
DevДвоичные данные и кодировка Base64 в 1С 8.Х#10 22.01.14 11:58
Выкладываю обработку. Там только листинг процедуры.

Прикрепленные файлы:

Проба64.epf
DevДвоичные данные и кодировка Base64 в 1С 8.Х#9 22.01.14 11:56
Выкладываю листинг в комментарий:
Код
&НаСервере
Функция Преобразовать64(Строка64 = неопределено, Массив64 = неопределено)
   Таб64 = Новый ТаблицаЗначений;
   Таб64.Колонки.Добавить("Код");
   Таб64.Колонки.Добавить("Символ");
   Нпп = 0;
   Для Код = КодСимвола("A") По КодСимвола("Z") Цикл
      стр = Таб64.Добавить();
      стр.Код = Нпп;
      стр.Символ = Символ(Код);
      Нпп = Нпп + 1;
   КонецЦикла;
   Для Код = КодСимвола("a") По КодСимвола("z") Цикл
      стр = Таб64.Добавить();
      стр.Код = Нпп;
      стр.Символ = Символ(Код);
      Нпп = Нпп + 1;
   КонецЦикла;
   стр = Таб64.Добавить();
   стр.Код = Нпп;
   стр.Символ = "0";
   Нпп = Нпп + 1;
   Для Код = 1 По 9 Цикл
      стр = Таб64.Добавить();
      стр.Код = Нпп;
      стр.Символ = Формат(Код,"ЧЦ=1; ЧДЦ=0");
      Нпп = Нпп + 1;
   КонецЦикла;
   стр = Таб64.Добавить();
   стр.Код = Нпп;
   стр.Символ = "+";
   Нпп = Нпп + 1;
   стр = Таб64.Добавить();
   стр.Код = Нпп;
   стр.Символ = "/";
   
   Если Массив64 = неопределено Тогда 
      Если Строка64 = неопределено Тогда
         Сообщить("неверный вызов функции");
         Возврат неопределено;
      КонецЕсли;
      //Уберем переносы строк
      Строка64 = СтрЗаменить(Строка64, Символ(10), "");
      Строка64 = СтрЗаменить(Строка64, Символ(13), "");
      
      //преобразовываем строку в массив
      Если СтрДлина(Строка64) % 4 <> 0 Тогда
         Сообщить("длина строки на входе должна быть кратна 4"); 
         Сообщить(СтрДлина(Строка64)); 
         Возврат неопределено;
      КонецЕсли;
      Кол4 = Цел(СтрДлина(Строка64) / 4);
      РазмерМ = Кол4 * 3;
      Если Прав(Строка64, 2) = "==" Тогда
         РазмерМ = РазмерМ - 2;
      ИначеЕсли Прав(Строка64, 1) = "=" Тогда
         РазмерМ = РазмерМ - 1;
      КонецЕсли;         
      Массив64 = Новый Массив(РазмерМ);
      Для А = 1 По Кол4 Цикл
         Число3 = 0;
         Для Б = 1 По 4 Цикл
            Буква1 = Сред(Строка64, (А-1)*4 + Б, 1);   
            Если Буква1 = "=" Тогда
               Код4 = 0;
            Иначе
               стрН = Таб64.Найти(Буква1, "Символ");
               Если стрН = Неопределено Тогда
                  Сообщить("ошибка при поиске "+ КодСимвола(Буква1));   
               Иначе 
                  Код4 = стрН.Код;
               КонецЕсли;
            КонецЕсли;
            Число3 = Число3 * 64 + Код4;
         КонецЦикла;
         Ост = Число3 % 256;
         Индекс = (А-1)*3 + 2;
         Если Индекс <= РазмерМ - 1 Тогда
            Массив64[Индекс] = Ост;
         КонецЕсли;
         Число3 = (Число3 - Ост) / 256;
         Ост = Число3 % 256;
         Индекс = (А-1)*3 + 1;
         Если Индекс <= РазмерМ - 1 Тогда
            Массив64[Индекс] = Ост;
         КонецЕсли;
         Число3 = (Число3 - Ост) / 256;
         Ост = Число3 % 256;
         Массив64[(А-1)*3 + 0] = Ост;
      КонецЦикла;
      Возврат Массив64;
   Иначе //Преобразовываем массив в строку
      Строка64 = "";
      Кол3 = Цел(Массив64.Количество() / 3);
      Если Массив64.Количество() % 3 <> 0 Тогда
         Кол3 = Кол3 + 1;
      КонецЕсли;
      Для А = 1 По Кол3 Цикл
         Число3 = Массив64[(А-1)*3];   
         Если (А-1)*3+1 <= Массив64.ВГраница() Тогда
            Код3 = Массив64[(А-1)*3+1];
         Иначе
            Код3 = 0;
         КонецЕсли;
         Число3 = Число3*256 + Код3;
         Если (А-1)*3+2 <= Массив64.ВГраница() Тогда
            Код3 = Массив64[(А-1)*3+2];
         Иначе
            Код3 = 0;
         КонецЕсли;
         Число3 = Число3*256 + Код3;
         
         Ост4 = Число3 % 64;
         Число3 = (Число3 - Ост4) / 64;
         Ост3 = Число3 % 64;
         Число3 = (Число3 - Ост3) / 64;
         Ост2 = Число3 % 64;
         Число3 = (Число3 - Ост2) / 64;
         Ост1 = Число3 % 64;
         Число3 = (Число3 - Ост1) / 64;
         стрН = Таб64.Найти(Ост1, "Код");
         Если стрН = неопределено Тогда
            Сообщить("Ошибка при поиске");
         Иначе
            Строка64 = Строка64 + стрН.Символ;
         КонецЕсли;
         стрН = Таб64.Найти(Ост2, "Код");
         Если стрН = неопределено Тогда
            Сообщить("Ошибка при поиске");
         Иначе
            Строка64 = Строка64 + стрН.Символ;
         КонецЕсли;
         стрН = Таб64.Найти(Ост3, "Код");
         Если стрН = неопределено Тогда
            Сообщить("Ошибка при поиске");
         Иначе
            Строка64 = Строка64 + стрН.Символ;
         КонецЕсли;
         стрН = Таб64.Найти(Ост4, "Код");
         Если стрН = неопределено Тогда
            Сообщить("Ошибка при поиске");
         Иначе
            Строка64 = Строка64 + стрН.Символ;
         КонецЕсли;
      КонецЦикла;
      //Если количество символов не делится на 3, то на конце должны быть
      //знаки "="
      Если Массив64.Количество() % 3 = 1 Тогда
         Строка64 = Лев(Строка64, СтрДлина(Строка64)-2)+ "==";   
      ИначеЕсли Массив64.Количество() % 3 = 2 Тогда
         Строка64 = Лев(Строка64, СтрДлина(Строка64)-1)+ "=";   
      КонецЕсли;
      Возврат Строка64;
   КонецЕсли;
КонецФункции