ComSafeArray Hexadecimal. О преобразовании массива байт в строку шестнадцатеричных чисел

16.09.16

Разработка - Механизмы платформы 1С

На самом деле, одним из первых заданий на любых курсах обучения программистов встречается задание преобразовать десятичное число в шестнадцатеричное. Ну, или любые другие системы исчисления. Задача эта несложна даже для начинающих программистов, поэтому многие ее с удовольствием реализуют. А в статье я расскажу о небольшой хитрости, которую придумали еще на заре программирования, когда памяти стало уже сильно больше 4 килобайт, а вычислительных мощностей всё не хватало.

Скачать исходный код

Наименование Файл Версия Размер
ComArray_Hecadecimal.epf
.epf 7,27Kb
2
.epf 7,27Kb 2 Скачать

Не далее как сегодня я снова столкнулся с этой задачей, но только в несколько преобразованном виде. В качестве исходных данных мне приходил большой массив 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"));
	КонецЦикла;
	Возврат МассивВозврата;
КонецФункции

Ну, и постскриптум. Если вы полностью разобрались в коде примера, то скачивать обработку вам не надо. Все основные методы приведены в статье.

ComSafeArray Hexadecimal шестнадцатеричный десятичный алгоритмы табличный метод

См. также

Сервисы интеграции без Шины и интеграции

Механизмы платформы 1С Программист Стажер Платформа 1С v8.3 Конфигурации 1cv8 Бесплатно (free)

Пример использования «Сервисов интеграции» без подключения к Шине и без обменов.

13.03.2024    3222    dsdred    16    

65

Как готовить и есть массивы

Механизмы платформы 1С Программист Стажер Платформа 1С v8.3 Бесплатно (free)

Все мы используем массивы в своем коде. Это один из первых объектов, который дают ученикам при прохождении обучения программированию. Но умеем ли мы ими пользоваться? В этой статье я хочу показать все методы массива, а также некоторые фишки в работе с массивами.

24.01.2024    7518    YA_418728146    25    

69

Планы обмена VS История данных

Перенос данных 1C Механизмы платформы 1С Системный администратор Программист Стажер Платформа 1С v8.3 Бесплатно (free)

Вы все еще регистрируете изменения только на Планах обмена и Регистрах сведений?

11.12.2023    7760    dsdred    36    

115

1С-ная магия

Механизмы платформы 1С Программист Бесплатно (free)

Язык программирования 1С содержит много нюансов и особенностей, которые могут приводить к неожиданным для разработчика результатам. Сталкиваясь с ними, программист начинает лучше понимать логику платформы, а значит, быстрее выявлять ошибки и видеть потенциальные узкие места своего кода там, где позже можно было бы ещё долго медитировать с отладчиком в поисках источника проблемы. Мы рассмотрим разные примеры поведения кода 1С. Разберём результаты выполнения и ответим на вопросы «Почему?», «Как же так?» и «Зачем нам это знать?». 

06.10.2023    20118    SeiOkami    46    

124

Дефрагментация и реиндексация после перехода на платформу 8.3.22

Механизмы платформы 1С Системный администратор Платформа 1С v8.3 Бесплатно (free)

Начиная с версии платформы 8.3.22 1С снимает стандартные блокировки БД на уровне страниц. Делаем рабочий скрипт, как раньше.

14.09.2023    14049    human_new    27    

77

Валидация JSON через XDTO (включая массивы)

WEB-интеграция Универсальные функции Механизмы платформы 1С Программист Платформа 1С v8.3 Конфигурации 1cv8 Бесплатно (free)

При работе с интеграциями рано или поздно придется столкнуться с получением JSON файлов. И, конечно же, жизнь заставит проверять файлы перед тем, как записывать данные в БД.

28.08.2023    10418    YA_418728146    7    

148

Внешние компоненты Native API на языке Rust - Просто!

Механизмы платформы 1С Программист Платформа 1С v8.3 Конфигурации 1cv8 Бесплатно (free)

Внешние компоненты для 1С можно разработывать очень просто, пользуясь всеми преимуществами языка Rust - от безопасности и кроссплатформенности до удобного менеджера библиотек.

20.08.2023    7017    sebekerga    54    

99
Оставьте свое сообщение