Вход | Регистрация


1С:Предприятие :: 1С:Предприятие 8 общая

ГУИД в массив байт, а затем сконвертировать в base64 строку

ГУИД в массив байт, а затем сконвертировать в base64 строку
Я
   fantomrik
 
12.01.18 - 09:44
Коллеги привет!

Делаю задачку по интеграции 1С и некого сайта. Мне нужно посылать определенные запросы, в теле которого определенным значением должен выступать GUID. Я попробовал передавать стандартный Новый УникальныйИдетификатор, но сайту он не подходит.

Программист со стороны сайта попросил следующее и привел пример, как надо сделать:

- ГУИДЫ должны быть преобразованы в массив байт а затем сконвертированы в base64 строку.

https://hostingkartinok.com/show-image.php?id=ca8266833c3b9d545a9e5df8f69557a7

Собственно не понимаю как в 1С мне это сделать?
 
 
   fantomrik
 
1 - 12.01.18 - 09:50
И вобще такое возможно чисто в 1С сделать или надо просить писать для данной задачи DLL-ку ребят с другого отдела?
   xaozai
 
2 - 12.01.18 - 10:01
   Юрий Лазаренко
 
3 - 12.01.18 - 10:03
(0) А что может быть не так с ГУИДом? В ГУИДе используются только латинские символы, с ними при передаче на сайт ничего произойти не может, это же не кириллица.
   v77
 
4 - 12.01.18 - 10:11
(0) ну возьми ГУИД как строку, ГУИД состоит из 16-ричных циферок, забей эти циферки в массив, массив закодируй в base64
приступай!
   fantomrik
 
5 - 12.01.18 - 10:14
(2) спасибо, из статьи получается, если

1) Если из гуида убрать символы "-", то это и есть двоичные данные закодированные в base64:

Base64Строка(Base64Значение("4e090376071043d29609c398fa23caa9")) = "4e090376071043d29609c398fa23caa9"

2) в статье описана функция, как получить из строки массив байтов, но в 1С нет же функции  как из этого массива собрать base64 строку, что хочет от меня программист сайта.

(3) Не знаю, уточню у него.

(4) Как массив закодировать в base64? В base64 можно же только двоичные данные закодировать вроде в 1С
   v77
 
6 - 12.01.18 - 10:14
в 1с есть ДвоичныеДанные и ПотокВПамяти
   v77
 
7 - 12.01.18 - 10:17
(5) ну ты попробуй такой же ГУИД как в примере из (0) закодируй как в (5). если прокатит, то вопрос решен
   fantomrik
 
8 - 12.01.18 - 10:20
(7) закодировать через ПотокВПамяти?
   dezss
 
9 - 12.01.18 - 10:22
Проси у него пример строки и результат.
Потом пробуй строку записать в файл, из него в ДвоичныеДанные, а их уже в base64.
   dezss
 
10 - 12.01.18 - 10:24
(9)+ Если не будет сходиться (только проверь на всех возможных кодировках файла), то преобразуй уже в массив байт (хотя я в этом никакого смысла не вижу, так как двоичные данные им по сути и являются).
 
 Рекламное место пустует
   v77
 
11 - 12.01.18 - 10:34
(8) ну как ты делал
Base64Строка(Base64Значение("4e090376071043d29609c398fa23caa9")) = "4e090376071043d29609c398fa23caa9"
   fantomrik
 
12 - 12.01.18 - 16:10
Решил задачу благодаря Использование классов .Net в 1С для новичков

Скачал http://files.rsdn.ru/19608/ФайлыNetObjectToIDispatch.zip , зарегал и делаю так:

NetObject = Новый COMОбъект("NetObjectToIDispatch45") ;
    
ИтоговыйGUID =  NetObject.ПолучитьТип("System.Convert").ToBase64String(NetObject.ПолучитьТип("System.Guid").Parse("08ed0482-a722-4182-b410-e77f3acc34e6").ToByteArray());

(ИтоговыйGUID = "ggTtCCKngkG0EOd/Osw05g==")
   dezss
 
13 - 12.01.18 - 16:40
(12) блин...один я не пойму, почему результат меньше исходного текста?
или ГУИД все же не совсем текст и в виде массива байт он короче своего строкового представления?
   Вафель
 
14 - 12.01.18 - 16:42
(13) гуид - это 16байт
   dezss
 
15 - 12.01.18 - 16:47
(14) блин, точна...спасибо...
1с развращает в этом плане, забываешь азы)))
   H A D G E H O G s
 
16 - 12.01.18 - 16:59
УИДСтрокой="08ed0482-a722-4182-b410-e77f3acc34e6";
    УИДСтрокой=СтрЗаменить(УИДСтрокой,"-","");
    БуферДанных=ПолучитьБуферДвоичныхДанныхИзHexСтроки(УИДСтрокой);
    Результат=ПолучитьBase64СтрокуИзБуфераДвоичныхДанных(БуферДанных);
    Сообщить(Результат);
   H A D G E H O G s
 
17 - 12.01.18 - 16:59
Добро пожаловать в новый светлый мир, Нео
   Вафель
 
18 - 12.01.18 - 17:34
(16) у тебя в итоге получается CO0EgqciQYK0EOd/Osw05g==, а не как в (12)
   Вафель
 
19 - 12.01.18 - 17:34
основной затык здесь получить гуид в виде byteArray
   dezss
 
20 - 12.01.18 - 17:41
(16) нужно еще порядок байт тогда поставить по феншую))))
   H A D G E H O G s
 
21 - 12.01.18 - 17:50
Это ваш C# чудит
   H A D G E H O G s
 
22 - 12.01.18 - 18:00
УИДСтрокой="08ed0482-a722-4182-b410-e77f3acc34e6";
    УИДСтрокой=СтрЗаменить(УИДСтрокой,"-","");
    БуферДанных=ПолучитьБуферДвоичныхДанныхИзHexСтроки(УИДСтрокой);
    КартаИнверсии=Новый Соответствие;
    КартаИнверсии.Вставить(4,1);
    КартаИнверсии.Вставить(3,2);
    КартаИнверсии.Вставить(6,5);
    КартаИнверсии.Вставить(8,7);
    Для Каждого КлючИнверсии Из КартаИнверсии Цикл
        ЗначениеПриемника=БуферДанных.Получить(КлючИнверсии.Значение-1);
        ЗначениеИсточника=БуферДанных.Получить(КлючИнверсии.Ключ-1);
        БуферДанных.Установить(КлючИнверсии.Ключ-1,ЗначениеПриемника);
        БуферДанных.Установить(КлючИнверсии.Значение-1,ЗначениеИсточника);
    КонецЦикла;
    Результат=ПолучитьBase64СтрокуИзБуфераДвоичныхДанных(БуферДанных);
    Сообщить(Результат);
   Serginio1
 
23 - 12.01.18 - 18:29
(21) Угу, может 1С не так конвертирует байты?
Вспомно про v8: Как перевести ГУИД в число и обратно?
   H A D G E H O G s
 
24 - 12.01.18 - 18:33
Ваша C# балована.
   Вафель
 
25 - 12.01.18 - 18:38
с гуидами вообще 1с как-то неохотно дружит
   Serginio1
 
26 - 12.01.18 - 19:11
   fantomrik
 
27 - 17.01.18 - 10:35
(22) самое оптимальное решение (0) СПАСИБО!!!
   H A D G E H O G s
 
28 - 22.01.18 - 13:41
БуферДанных=ПолучитьБуферДвоичныхДанныхИзBase64Строки(Результат);
    Для Каждого КлючИнверсии Из КартаИнверсии Цикл
        ЗначениеПриемника=БуферДанных.Получить(КлючИнверсии.Ключ-1);
        ЗначениеИсточника=БуферДанных.Получить(КлючИнверсии.Значение-1);
        БуферДанных.Установить(КлючИнверсии.Ключ-1,ЗначениеИсточника);
        БуферДанных.Установить(КлючИнверсии.Значение-1,ЗначениеПриемника);
    КонецЦикла;
    УИДСтрокой=ПолучитьHexСтрокуИзБуфераДвоичныхДанных(БуферДанных);
    Результат=сред(УИДСтрокой,1,8)+"-"+сред(УИДСтрокой,9,4)+"-"+сред(УИДСтрокой,13,4)+"-"+сред(УИДСтрокой,17,4)+"-"+сред(УИДСтрокой,21);
    Сообщить(Результат);
   fantomrik
 
29 - 22.01.18 - 13:52
(28) Мозг !!! :)
Спасибо!
   fantomrik
 
30 - 24.01.18 - 11:42
(28) тут кстати кусочек с "КартаИнверсии" пропущен) А так благодаря H A D G E H O G имеем чудные процедуры перевода ГУИД в Base64 и обратно



Функция ГУИД_Из_1С_в_Base64(ГУИД_Из_1С_Строкой)
    
    ГУИД_Из_1С_Строкой_ = СтрЗаменить(ГУИД_Из_1С_Строкой,"-","");
    БуферДанных         = ПолучитьБуферДвоичныхДанныхИзHexСтроки(ГУИД_Из_1С_Строкой_);
    
    КартаИнверсии = Новый Соответствие;
    КартаИнверсии.Вставить(4,1);
    КартаИнверсии.Вставить(3,2);
    КартаИнверсии.Вставить(6,5);
    КартаИнверсии.Вставить(8,7);
    
    Для Каждого КлючИнверсии Из КартаИнверсии Цикл
        ЗначениеПриемника = БуферДанных.Получить(КлючИнверсии.Значение-1);
        ЗначениеИсточника = БуферДанных.Получить(КлючИнверсии.Ключ-1);
        БуферДанных.Установить(КлючИнверсии.Ключ-1,ЗначениеПриемника);
        БуферДанных.Установить(КлючИнверсии.Значение-1,ЗначениеИсточника);
    КонецЦикла;
    
    Возврат ПолучитьBase64СтрокуИзБуфераДвоичныхДанных(БуферДанных);
    
КонецФункции 

Функция ГУИД_Из_Base64_В_1С(ГУИД_Base64_Строкой)
    
    БуферДанных = ПолучитьБуферДвоичныхДанныхИзBase64Строки(ГУИД_Base64_Строкой);
    
    КартаИнверсии = Новый Соответствие;
    КартаИнверсии.Вставить(4,1);
    КартаИнверсии.Вставить(3,2);
    КартаИнверсии.Вставить(6,5);
    КартаИнверсии.Вставить(8,7);
    
    Для Каждого КлючИнверсии Из КартаИнверсии Цикл
        ЗначениеПриемника = БуферДанных.Получить(КлючИнверсии.Ключ-1);
        ЗначениеИсточника = БуферДанных.Получить(КлючИнверсии.Значение-1);
        БуферДанных.Установить(КлючИнверсии.Ключ-1,ЗначениеИсточника);
        БуферДанных.Установить(КлючИнверсии.Значение-1,ЗначениеПриемника);
    КонецЦикла;
    
    УИДСтрокой = ПолучитьHexСтрокуИзБуфераДвоичныхДанных(БуферДанных);
    Результат  = Сред(УИДСтрокой,1,8)+"-"+Сред(УИДСтрокой,9,4)+"-"+Сред(УИДСтрокой,13,4)+"-"+Сред(УИДСтрокой,17,4)+"-"+Сред(УИДСтрокой,21);
    
    Возврат Нрег(Результат);
    
КонецФункции


Список тем форума
Рекламное место пустует  Рекламное место пустует
ВНИМАНИЕ! Если вы потеряли окно ввода сообщения, нажмите Ctrl-F5 или Ctrl-R или кнопку "Обновить" в браузере.
Тема не обновлялась длительное время, и была помечена как архивная. Добавление сообщений невозможно.
Но вы можете создать новую ветку и вам обязательно ответят!
Каждый час на Волшебном форуме бывает более 2000 человек.
Рекламное место пустует