Не далее как сегодня я снова столкнулся с этой задачей, но только в несколько преобразованном виде. В качестве исходных данных мне приходил большой массив ComSafeArray. Каждое значение этого массива содержало 16 элементов размерностью 1 байт. Естественно, я полез вспоминать арифметику и математику, думать пригодится ли мне здесь целочисленное деление.
Но стоп! На самом деле один байт может принимать всего-то 256 значений (0x00-0xFF). Значит, для решения этой задачи мы можем применить довольно старый и испытанный табличный метод преобразования. Метод прост до безобразия. Все возможные исходящие значения записываются в табличку, которая достаточно легко адресуется. Для преобразования десятичного в шестнадцатиричный надо просто сгенерить последовательность из пар чисел: "00 01 02 03 ... 0E 0F 10 11 ... FD FE FF". Индекс значения в массиве равен значению байта полученного числа.
Естественно, табличный метод тратит время на генерацию собственно таблицы. Но если необходимо преобразовать не один ComSafeArray, а сотни и тысячи, то время на генерацию таблицы не сопоставимо с выигрышем в простоте ее применения.
Достаточно растекаться мыслею, приведу код табличного метода преобразования ComSaveArray в HexaDecimal вид.
&НаСервереБезКонтекста
Функция ОбработатьМассивДанных(МассивДанных)
МассивВозврата = Новый Массив;
// Строим словарь.
МассивШестнадцатиричныхЗначений = Новый Массив(256);
Словарь = "0123456789ABCDEF";
Для Счт1 = 0 По 15 Цикл
Для Счт2 = 0 По 15 Цикл
МассивШестнадцатиричныхЗначений[Счт1 * 16 + Счт2] = Сред(Словарь, Счт1 + 1, 1) + Сред(Словарь, Счт2 + 1, 1)
КонецЦикла;
КонецЦикла;
// Обрабатываем данные
Для Каждого Данное Из МассивДанных Цикл
Если Данное = NULL Тогда
МассивВозврата.Добавить("NULL");
Иначе
Стр = "0x";
Для Каждого Байт Из Данное Цикл
Стр = Стр + МассивШестнадцатиричныхЗначений[Байт];
КонецЦикла;
МассивВозврата.Добавить(Стр);
КонецЕсли;
КонецЦикла;
Возврат МассивВозврата;
КонецФункции
Функция принимает массив, который содержит ComArray. И возвращает массив, который содержит строки. Тестовые данные я генерирую следующей функцией.
&НаСервереБезКонтекста
Функция СгенерироватьНаборДанных(КоличествоТестовыхДанных)
ГСЧ = Новый ГенераторСлучайныхЧисел;
МассивВозврата = Новый Массив;
Для Счт1 = 1 По КоличествоТестовыхДанных Цикл
Масс = Новый Массив(16);
Для Счт2 = 0 По 15 Цикл
Масс[Счт2] = ГСЧ.СлучайноеЧисло(0, 255);
КонецЦикла;
МассивВозврата.Добавить(Новый COMSafeArray(Масс, "VT_UI1"));
КонецЦикла;
Возврат МассивВозврата;
КонецФункции
Ну, и постскриптум. Если вы полностью разобрались в коде примера, то скачивать обработку вам не надо. Все основные методы приведены в статье.