Перевод чисел в шестнадцатеричную систему на примере генератора случайных цветов

Публикация № 977449

Программирование - Практика программирования

HEX

6
Демонстрация новой возможности платформы (8.3.13.1513) на практическом примере.

Понадобилось мне генерить рандомные цвета для вывода полигонов на карту одного отечественного сервиса. Подставлять мне их надо было в текст JS-скрипта и они должны были быть в HEX-формате (RRGGBB). Памятуя о колхозных процедурах преобразования в шестнадцатеричную систему в 1С я понадеялся, что в новых релизах платформы что-нибудь могло появиться на эту тему и затаив дыхание написал "HEХ" в поиске по справке...

ПолучитьHexСтрокуИзБуфераДвоичныхДанных(<Буфер>)
Параметры:
<Буфер> (обязательный)
Тип: БуферДвоичныхДанных.
Буфер двоичных данных.

Возвращаемое значение:
Тип: Строка.

Описание:
Преобразует буфер двоичных данных в строку формата Base 16 (Hex).
 

Возник вопрос, что за  буфер такой и можно ли в него запихнуть нужное мне значение:

БуферДвоичныхДанных

Описание:
Коллекция байтов фиксированного размера с возможностью произвольного доступа и изменения по месту.
 

Вроде подходит, надо попробовать:

Генератор = Новый ГенераторСлучайныхЧисел(ТекущаяУниверсальнаяДатаВМиллисекундах());
ЦветЧислом = Генератор.СлучайноеЧисло(0, 16777215);
Буфер = Новый БуферДвоичныхДанных(4, ПорядокБайтов.LittleEndian);
Буфер.ЗаписатьЦелое32(0, ЦветЧислом);
Цвет = Лев(ПолучитьHexСтрокуИзБуфераДвоичныхДанных(Буфер), 6);

Инициализируем ГСЧ максимально уникальным значением. Пробовал сначала просто ТекущаяДата(), но в одну секунду процедура успевала выполниться много раз и получался один и тот же цвет, поэтому перешёл на миллисекунды.

Генерим число в диапазоне от 0x0 до 0xFFFFFF.

Создаём буфер. Нам нужно три байта, но поскольку нет метода записи в буфер чисел из трёх байтов :) и есть метод записи в буфер числа из 4х байтов, поставил 4 байта.

Записываем в буфер наше случайное число и получаем значение буфера в виде HEX-строки. Последний байт нам не нужен, поэтому берём только первые 3.

Вот такой относительно простой способ преобразования в HEX у нас появился. Советую почитать про эту группу методов, они ещё много чего полезного умеют (например, Base64-кодирование двоичных данных: ПолучитьBase64ДвоичныеДанныеИзДвоичныхДанных).

6

См. также

Специальные предложения

Комментарии
Избранное Подписка Сортировка: Древо
1. AnderWonder 23 10.01.19 17:00 Сейчас в теме
Вообще-то эта функция уже в 8.3.10 появилась.
2. PLAstic 213 10.01.19 17:01 Сейчас в теме
(1) Версию указал справочно, где точно есть. Спасибо за уточнение.
3. ltfriend 306 10.01.19 21:55 Сейчас в теме
Инициализируем ГСЧ максимально уникальным значением. Пробовал сначала просто ТекущаяДата(), но в одну секунду процедура успевала выполниться много раз и получался один и тот же цвет, поэтому перешёл на миллисекунды.

Потому что инициализацию ГСЧ нужно вынести из цикла и сделать это один раз. Ну или, если это функция, то инициализировать вне функции из передавать в функцию в качестве параметра.
4. PLAstic 213 11.01.19 09:08 Сейчас в теме
(3) Это очевидно. Но из-за кривой логики, в которую я встраивал решение, пришлось бы таскать потом ГСЧ операндом к трём функциям. Поэтому так.
Оставьте свое сообщение