gifts2017

Системы счисления

Опубликовал Олександр Ужела (uzhelas) в раздел Программирование - Практика программирования

Обработка для перевода из одной системы счисления в другую

Обработка на управляемых формах позволяет перевести число из системы счисления 1<N<37 в систему 1<M<37.

Алгоритм преобразования чисел можно найти здесь. Сначала число переводится из N-разрядной системы в десятичную, потом из десятичной в М-разрядную. 

Скачать файлы

Наименование Файл Версия Размер
Системы счисления 4
.erf 7,84Kb
11.06.15
4
.erf 1.0 7,84Kb Скачать

См. также

Подписаться Добавить вознаграждение
Комментарии
1. Михаил Гусев (Идальго) 13.06.15 10:32
Было уже вроде что-такое. Вот тут н-р вроде есть обе функции http://www.forum.mista.ru/topic.php?id=560858
2. ediks (ediks) 15.06.15 11:43
Размерность системы счЕсления М: 16 - как-то не совсем аккуратно.
3. eugenie zheludkov (eugeniezheludkov) 16.06.15 03:23
а я для кодирования актуальности ценников кодировал ШК(артикул с ценой) в base58 (для уменьшения размера ШК) в формате bitcoin с проверкой КС вот такими самопальными функциями, если в алгоритме base58 поменять строку символов на другую с другой длиной то будет любая система счисления декодер/энкодер преобразующий в массив байт и просто в число
Функция ПолучитьНибл(Ч)
	Возврат Сред("0123456789abcdef",1+Ч%16,1);
КонецФункции

Функция Byte2Hex(с)
	 Возврат ПолучитьНибл(с/16) + ПолучитьНибл(с);
КонецФункции

Функция Array2Hex(МассивБайт, Разделитель = "")
	Стр = "";
	Для Каждого	Байт из МассивБайт Цикл
		Стр = Стр + Byte2Hex(Байт) + Разделитель;
	КонецЦикла;	
	Возврат Стр;
КонецФункции
//bits
Функция УстановитьБит(ч, НомерБита) Экспорт
	Если Не СчитатьБит(ч, НомерБита) Тогда	
		ч = ч + pow(2, НомерБита);
	КонецЕсли;
	Возврат ч;	
КонецФункции
//устанавливаем бит в 0
Функция СброситьБит(ч, НомерБита) Экспорт
	если СчитатьБит(ч, НомерБита) Тогда	
		ч = ч - pow(2, НомерБита);
	КонецЕсли;
	Возврат ч;	
КонецФункции
//если бит 1 тогда истина иначе ложь	
Функция СчитатьБит(ч, НомерБита) экспорт
	Возврат Цел((ч%pow(2, НомерБита+1))/pow(2, НомерБита)) = 1;
КонецФункции
//Base58
Функция Base58Encode(знач х) Экспорт
	Если х = 0 Тогда Возврат "11"; КонецЕсли;
	Симв = "123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz"­;//	bitcoin base58 encode 
	Стр = "";
	Base = СтрДлина(Симв);
	Пока х > 0 Цикл
		б = х % Base;
		Стр = Сред(Симв, б+1, 1) + Стр;
		х = Цел(х/Base);
	КонецЦикла;
	Возврат Стр;	
КонецФункции

функция Base58Decode(Стр) Экспорт
	Симв = "123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz"­ ; //	bitcoin base58 encode 
	Base = СтрДлина(Симв);
	Стр = СокрЛП(Стр);
	д = СтрДлина(Стр);
	х = 0;
	Для н = 1 По д Цикл
		б = Найти(Симв, Сред(Стр, н, 1));
		х = (х * Base) + ?(б <= 0, 0, б - 1); //все спецсимволы или нераспознанные интерпретируем как 0
	КонецЦикла;
	Возврат х;	
КонецФункции

Функция Array2Base58(Array)
	РезультатБольшоеЧисло = 0;
	Для Каждого ЧислоМассива из Array Цикл
		РезультатБольшоеЧисло = РезультатБольшоеЧисло * 256 + ЧислоМассива%256;
	КонецЦикла;
	Возврат ?(Array[0] = 0 ,"1","")+Base58Encode(РезультатБольшоеЧисло);	
КонецФункции

Функция Base58Array(Число58)
	МассивБайт = Новый Массив();
	РезультатБольшоеЧисло = Base58Decode(Число58);
	Base = 256;
	Пока РезультатБольшоеЧисло > 0 Цикл
		Байт = РезультатБольшоеЧисло % Base;
		МассивБайт.Добавить(Байт);
		РезультатБольшоеЧисло = Цел(РезультатБольшоеЧисло/Base);
	КонецЦикла;
	Если Лев(Число58,1) = "1" Тогда МассивБайт.Добавить(0); КонецЕсли;
	Максимум = МассивБайт.ВГраница();
	Для Итератор = 0 По Максимум/2 Цикл
		Байт = МассивБайт[Максимум - Итератор];
		МассивБайт.Установить(Максимум - Итератор, МассивБайт[Итератор]);
		МассивБайт.Установить(Итератор, Байт);
	КонецЦикла;
	Возврат МассивБайт;
КонецФункции

Функция ПолучитьХэш256(МассивБайт)
...Показать Скрыть