v8: Как рассчитать размер данных помещенных в объект ХранилищеЗначения Ключевые слова: размер данных, ХранилищеЗначения, Base64
Любые данные в 1С можно получить в виде строкового представления с помощью функции ЗначениеВСтрокуВнутр.
Выполним данную функцию с объектом ХранилищеЗначения:
ХранилищеЗначения = Новый ХранилищеЗначения(Новый ДвоичныеДанные(ИмяФайла));
ХранилищеЗначенияСтрока = ЗначениеВСтрокуВнутр(ХранилищеЗначения);
Функция возвращает строку вида:
{"#",e199ca70-93cf-46ce-a54b-6edc88c3a296,{#base64:AQE9AAAAAAAAAOЇ}}
Т.е. по указанию "base64" можно предположить, что двоичные данные кодированы в формате Base64, который используется для преобразования двоичного формата в текстовый. Более подробно про Base64 можно прочитать перейдя по этой ссылке: http://www.delphikingdom.com/asp/viewitem.asp?catalogid=691
Если коротко, то кодирование сводится к тому что 3 байта двоичных данных можно представить 4 символами в кодировке ASCII. Но если приходится кодировать на 3 байта, а 2 или 1 то в конце 4х символьного стринга добавляются символы "=" и "==".
Следующий шаг, получаем двоичные данные:
Поз = Найти(ХранилищеЗначенияСтрока,"#base64:");
ДанныеBase64 = Сред(ХранилищеЗначенияСтрока,Поз+8,СтрДлина(ХранилищеЗначенияСтрока)-Поз-10);
Обладая данными можем расчитать кол-во байтов помещенных в эти данные:
ДлинаФайла = СтрДлина(ДанныеBase64) - ?(Прав(ДанныеBase64,1) = "=",1,0) - ?(Прав(ДанныеBase64,2) = "==",1,0);
ДлинаФайла = Цел(ДлинаФайла/4*3)-83;
Первая строчка рассчитывает кол-во реальных символов, которые кодирует данные. Во второй строчке выполняем ДлинаФайла/4*3 и целый результат, поскольку тот остаток, который образуется это есть то случай, когда на завершение остаются один или два байта. Опытным путем было вычисленно, что сам объект ХранилищеЗначения занимает 83 байта, т.е. на "полезные данные" остается все остальное пространство.
Следующий пример реализации обработки, которая считает размер файлов в байтах:
http://proba1c.narod.ru/downloads/razmer.rar
PS: эксперимент не проводился со сжатым хранилищем значения, но скорее всего в результате будет получен размер сжатых данных |