Расшифровка текстового файла закодированную в строку из 36-кодированного числа GOAN

1. danya1606 25 09.01.13 12:43 Сейчас в теме
Добрый день!
Ранее была функция написанная на конфигурации 7.7 ЗИК, такого содержания:
Функция глЧисло36ВСтроку(Стр="") Экспорт
//	Возвращает исходную закодированную строку из 36-кодированного числа GOAN
//	Используется для поиска исходных значений по штрих-коду
//
	// Исходная строка является набором символов "0..9", "A".."Z"
	// Создадим непрерывный интервал значений
	Делимое = ""; Частное = ""; Результ = "";
	Для Сч=1 по СтрДлина(Стр) Цикл
		Цифра36 = Сред(Стр,Сч,1);
		Если Найти("0123456789",Цифра36)>0 Тогда Ч=Симв(Число(Цифра36)+1); Иначе Ч=Симв((КодСимв(Цифра36))-(КодСимв("A"))+10+1); КонецЕсли;
		Делимое = Делимое + Ч;
	КонецЦикла;
    
	// Переведем в новую систему счисления
	Пока СтрДлина(Делимое) > 0 Цикл
		// Разделим число по базе 36 на основание новой системы счисления (255) с остатком
		ТекОст = Симв(1);
		Пока СтрДлина(Делимое) > 0 Цикл
			Цифра   = Лев(Делимое,1);
			ТекДел  = (КодСимв(ТекОст)-1)*36+(КодСимв(Цифра)-1);
			Частное = Частное+Симв(Цел(ТекДел/255)+1);
	        ТекОст  = Симв(ТекДел%255+1);
			Делимое = Прав(Делимое,СтрДлина(Делимое)-1);
		КонецЦикла;
		// Остаток - значение цифры для новой системы счисления
		Результ = ТекОст + Результ;
		// Обрежем у частного лидирующие нули
		Пока (СтрДлина(Частное)>0) и (Лев(Частное,1)=Симв(1)) Цикл Частное=Сред(Частное,2); КонецЦикла;
		// Частное будем делить дальше для получения нового остатка
		Делимое = Частное; Частное="";
	КонецЦикла;
	
	// Вернем результирующую строку по базе 255
	// Для v8 придется перевести строку из набора символов OEM обратно в Unicode
	Возврат Результ;
КонецФункции //глЧисло36ВСтроку
Показать


Она расшифровывает текстовый документ напримере файла Табель214_021012-зашифрованный и перезаписывает туда же в виде второго текстового документа Табель214_021012 - с 1С 77.

Переведя на код платформы 1С 8.2 ЗУП такого вида:
Функция глЧисло36ВСтроку(Стр="") Экспорт
//	Возвращает исходную закодированную строку из 36-кодированного числа GOAN
//	Используется для поиска исходных значений по штрих-коду
//
	// Исходная строка является набором символов "0..9", "A".."Z"
	// Создадим непрерывный интервал значений
	Делимое = ""; Частное = ""; Результ = "";
	Для Сч=1 по СтрДлина(Стр) Цикл
		Цифра36 = Сред(Стр,Сч,1);
		Если Найти("0123456789",Цифра36)>0 Тогда Ч=Символ(Число(Цифра36)+1); 
		Иначе Ч=Символ((КодСимвола(Цифра36))-(КодСимвола("A"))+10+1); 
	КонецЕсли;
		Делимое = Делимое + Ч;
	КонецЦикла;
	
	// Переведем в новую систему счисления
	Пока СтрДлина(Делимое) > 0 Цикл
		// Разделим число по базе 36 на основание новой системы счисления (255) с остатком
		ТекОст = Символ(1);
		Пока СтрДлина(Делимое) > 0 Цикл
			Цифра   = Лев(Делимое,1);
			ТекДел  = (КодСимвола(ТекОст)-1)*36+(КодСимвола(Цифра)-1);
			Частное = Частное+Символ(Цел(ТекДел/255)+1);
			ТекОст  = Символ(ТекДел%255+1);
			Делимое = Прав(Делимое,СтрДлина(Делимое)-1);
		КонецЦикла;
		// Остаток - значение цифры для новой системы счисления
		Результ = ТекОст + Результ;
		// Обрежем у частного лидирующие нули
		Пока (СтрДлина(Частное)>0) и (Лев(Частное,1)=Символ(1)) Цикл Частное=Сред(Частное,2); КонецЦикла;
		// Частное будем делить дальше для получения нового остатка
		Делимое = Частное; Частное="";
	КонецЦикла;
	
	// Вернем результирующую строку по базе 255
	// Для v8 придется перевести строку из набора символов OEM обратно в Unicode
	Возврат Результ;
КонецФункции //глЧисло36ВСтроку

Показать


А результат получается в виде третьего файла Табель214_021012 - с 1c 82

Как в программе сделать правильную кодировку, пробовал сохранять текстовый файл в разных типах кодировок, не помогает.
Функция РасшифроватьТабель(ЗашифрованныйФайл)
	Попытка
		ТекстовыйФайл = Новый ТекстовыйДокумент;		
		ТекстовыйФайл.Прочитать(ЗашифрованныйФайл);

		СпрПодразделения = Справочники.Подразделения;
		Если СпрПодразделения.НайтиПоКоду(ТекстовыйФайл.ПолучитьСтроку(1)) = 1 Тогда
			СпрПодразделения = "";
			ТекстовыйФайл = "";
			Возврат 1;
		Иначе
			//расшифруем файл
			Состояние("Идет расшифровка файла табеля...");
			
			Для Сч = 1 По ТекстовыйФайл.КоличествоСтрок() Цикл
				ТекстовыйФайл.ЗаменитьСтроку(Сч,глЧисло36ВСтроку(СокрЛП(ТекстовыйФайл.ПолучитьСтроку(Сч))));	
			КонецЦикла;
			ТекстовыйФайл.Записать(ЗашифрованныйФайл);
							
			СпрПодразделения = "";	
			ТекстовыйФайл = "";
			Возврат 1;
		КонецЕсли;
	Исключение       
		СпрПодразделения = "";
		ТекстовыйФайл = "";
		Сообщить("Ошибка при открытии файла табеля","!!!");
		Возврат 0; 
	КонецПопытки;	
КонецФункции //РасшифроватьТабель
Показать
Прикрепленные файлы:
Табель214_021012-зашифрованный.txt
Табель214_021012 - с 1c 82.txt
Табель214_021012 - с 1С 77.txt
Ответы
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
2. andrewks 1371 09.01.13 21:38 Сейчас в теме
в 1с 8 строки - не ANSI, а Unicode. соответственно, Символ и КодСимвола работают с Unicode-кодами символов.
детально код не разбирал, но скорее всего, дело в этом
3. danya1606 25 09.01.13 23:25 Сейчас в теме
Неужели я первый человек столкнувшийся с этой проблемой?
У меня есть идея решения, но насколько она правильна?
Думаю создать некую таблицу соответствий кодировок символов, но теперь нужно ее найти.
Оставьте свое сообщение

Для получения уведомлений об ответах подключите телеграм бот:
Инфостарт бот