gifts2017

Быстрая запись и чтение массива байт в/из файла средствами платформы

Опубликовал А Р (p1l1gr1m) в раздел Программирование - Универсальные функции

Простой способ записать массив байт в файл или прочитать его из файла, используя только средства платформы.

Записать массив произвольных байт в файл или прочитать его можно различными способами - используя внешние компоненты, применяя алгоритм конвертации из/в Base64 и т.д.

Однако существует простой способ записать массив байт в файл или прочитать его только штатными средствами платформы.

Это возможно благодаря поддержке платформой (начиная с версии 8.1) записи/чтения текста в кодировке "ISO-8859-1" - это фактически единственная кодировка, где символы кодируются одним байтом и значение, которым кодируется каждый символ, равно значению кода данного символа в ASCII таблице (для всех остальных кодировок это верно только для нижней ASCII таблицы, тогда как символы из верхней кодируются различно).

Таким образом, записав или прочитав файл как текст в данной кодировке (игнорируя символы переноса строк), ASCII код каждого символа будет равен числовому значению соотв. байта.

Процедура ЗаписатьМассивБайтВФайл(МассивБайт, ПутьКФайлу)
    
    ТекстовыйДокумент = Новый ТекстовыйДокумент;
	СтрокаТекста = "";
	Для Каждого ТекБайт Из МассивБайт Цикл
		СтрокаТекста = СтрокаТекста + Символ(ТекБайт);
	КонецЦикла; 
	
    ТекстовыйДокумент.УстановитьТекст(СтрокаТекста);
	ТекстовыйДокумент.Записать(ПутьКФайлу, "ISO-8859-1", "");
    
КонецПроцедуры


Функция ПолучитьМассивБайтИзФайла(ПутьКФайлу)
	
	ТекстовыйДокумент = Новый ТекстовыйДокумент;
	ТекстовыйДокумент.Прочитать(ПутьКФайлу, "ISO-8859-1", "");
	ТекстФайла = ТекстовыйДокумент.ПолучитьТекст();
	
	МассивБайт = Новый Массив;
	
	ДлинаТекста = СтрДлина(ТекстФайла);
	Для Сч = 1 По ДлинаТекста Цикл
		ТекСимвол = Сред(ТекстФайла, Сч, 1);
		МассивБайт.Добавить(КодСимвола(ТекСимвол));
	КонецЦикла;
	
	Возврат МассивБайт;
	
КонецФункции


Аналоги:
http://infostart.ru/public/252365/
http://infostart.ru/public/263177/

См. также

Подписаться Добавить вознаграждение

Комментарии

1. Максим Кузнецов (Makushimo) 23.07.14 12:22
Для чего это может понадобиться?
Область применения где?
2. А Р (p1l1gr1m) 23.07.14 13:08
(1) Makushimo, Это может понадобиться во всех случаях, когда вам нужно узнать значения конкретных байтов файла. Например, прочитать файл с данными некоего приложения и т.д. В моей практике таких случаев было масса.
3. Андрей Плотников (ayuplotnikov) 22.09.15 09:05
Если считываемый файл содержит нулевой байт где-то в середине, ТекстФайла в этом месте не оборвется?
4. Сергей Ожерельев (Поручик) 27.10.15 11:06
Может правильней использовать не ТекстовыйДокумент, а соответственно ЧтениеТекста/ЗаписьТекста
5. Булат Шаймарданов (mrbus) 01.07.16 08:02
1) Нуль-байты не являются признаком конца строки, для 1С это обычный символ.
2) Прочитанные данные вполне можно так и оставить в виде строки. В 1С время доступа к произвольной части строки - константное, как для массива. А накладных расходов меньше.
6. Николай ~ ~ (kuzyara) 29.07.16 03:48
Процедура ЗаписатьМассивБайтВФайл(МассивБайт, ПутьКФайлу)
    
	СтрокаТекста = "";
	Для Каждого ТекБайт Из МассивБайт Цикл
	    СтрокаТекста = СтрокаТекста + Символ(ТекБайт);
	КонецЦикла; 
	
	ТекстПостроитель = Новый ЗаписьXML; 
    ТекстПостроитель.ОткрытьФайл(ПутьКФайлу,"ISO-8859-1");
	ТекстПостроитель.ЗаписатьБезОбработки(СтрокаТекста);	// #13#10 !
	ТекстПостроитель.Закрыть();
    
КонецПроцедуры
...Показать Скрыть
Для написания сообщения необходимо авторизоваться
Прикрепить файл
Дополнительные параметры ответа