Вход | Регистрация
 
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);
    
    Возврат Нрег(Результат);
    
КонецФункции


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