Имя: Пароль:
1C
 
ADODB.Stream чтение bin файла
0 Nordok
 
22.10.07
16:02
Stream = CreateObject("ADODB.Stream");
   Stream.Type = 1;
   Stream.Open();
   Stream.LoadFromFile(FileName);
   Stream.Position = 0;
   Data = "";
   While Stream.EOS = 0 Do
       //Как тут прочитать символ из потока
   EndDo;
       
   Stream.Close();
1 IUnknown
 
22.10.07
16:12
2 Nordok
 
22.10.07
16:29
Засада, возвращает variant... может подскажете как прочитать бин файл?
3 smaharbA
 
22.10.07
17:11
MSscriptControl
а нафига как бин ?
4 Nordok
 
22.10.07
17:27
(3) В базе сохранять word файлы, что бы по УРИБ передавались
5 Господин ПЖ
 
22.10.07
17:30
(4) Я в своё время пробывал картинки передавать - не полетело. Картинка сохраняется, но цвета другие. Лазил в отладчике - до сохранения строка одна, после другая. ХЗ почему.
6 Nordok
 
22.10.07
17:33
(5) Там проблем много, сохранять надо бинарник в неограиченную строку (на самом деле ограниченную около 700кБ вроде, приходится бить), 1с не воспринимает симовлы 0 и если в конце строки 1-32 то обрезает их нах, все взлетает с ВК, но хочется без ВК :)
7 smaharbA
 
22.10.07
17:35
см (3) + аски85
8 smaharbA
 
22.10.07
17:35
и... уж тогда лучче ртф, там простой текст все
9 smaharbA
 
22.10.07
17:36
(6) симв(0) прекрасно воспринимается, только немного подумать
10 Господин ПЖ
 
22.10.07
17:37
(6) >>1с не воспринимает симовлы 0 и если в конце строки 1-32 то обрезает их нах

это всё решаемо. Вопрос был не в целостности, а в непонятных искажениях.

>>взлетает с ВК, но хочется без ВК

Можно и без ВК. Но это долго работает.
11 Nordok
 
22.10.07
17:41
(10) Ну если уж свосем ппц, то ВК придется юзать...
12 vde69
 
22.10.07
17:44
BinFiles.dll - тебе поможет
13 Nordok
 
22.10.07
17:50
(12) её то и пробовал, все сработало пучком
14 smaharbA
 
22.10.07
17:54

Перем Ширина,Позиция,Кортеж,Количество,Стр,МассивДекодера[5],ФСО,Скрипт;
Перем МассивСдвига[4];

//*******************************************
Функция Индикатор(к,Кол,Ограничение=64)
   Ч=к/Кол;
   Возврат СтрЗаменить(Формат(СтрЗаменить(Формат("","С"+Цел(Ограничение*Ч))," ","|"),"С"+Ограничение)," ",".")+Формат(Окр(100*Ч,2),"Ч6.2")+"%";
КонецФункции    // Индикатор

//****** Кодер85 (Начало)
Функция Начало()
   Позиция=2;
   Стр="<~";
   Возврат Стр;
КонецФункции    // Начало

Функция Кодирование()
   Перем МассивСимв[5];
   Для к=1 По 5 Цикл
       МассивСимв[к]=Кортеж % 85;
       Кортеж=Цел(Кортеж/85);
   КонецЦикла;
   Для к=1 По Количество+1 Цикл
       Стр=Стр+Симв(МассивСимв[6-к]+33);
       Если Позиция>=Ширина Тогда
           Позиция=0;
           Стр=Стр+РазделительСтрок;
       Иначе
           Позиция=Позиция+1;
       КонецЕсли;
   КонецЦикла;
КонецФункции    // Кодирование

Функция Конец()
   Если Количество>0 Тогда
       Кодирование();
   КонецЕсли;
   Если Позиция+2>Ширина Тогда
       Стр=Стр+РазделительСтрок;
   КонецЕсли;
   Стр=Стр+"~>"+РазделительСтрок;
КонецФункции    // Конец

Функция Применить85(Знач с)
       Количество=Количество+1;
       Кортеж=Кортеж+(с*МассивСдвига[Количество]);
       Если Количество=4 Тогда
           Если Кортеж=0 Тогда
               Стр=Стр+"z";
               Если Позиция>=Ширина Тогда
                   Позиция=0;
                   Стр=Стр+РазделительСтрок;
               Иначе
                   Позиция=Позиция+1;
               КонецЕсли;
           Иначе
               Кодирование();
               Кортеж=0;
           КонецЕсли;
           Количество=0;
       КонецЕсли;
КонецФункции    // Применить85

Функция Копи85(Файл)
   Перем РазмерФайла;
   ФС.АтрибутыФайла(Файл,РазмерФайла);
   ФайлОбъект=ФСО.OpenTextFile(Файл);
   к=0;
   Пока ФайлОбъект.atendofstream()=0 Цикл
       Символ=""+ФайлОбъект.read(1);
       Если Символ="" Тогда
           Байт=0;
       Иначе
           Байт=КодСимв(Символ);
       КонецЕсли;
       Применить85(Байт);
       к=к+1;
       Состояние(Индикатор(к,РазмерФайла));
   КонецЦикла;
   ФайлОбъект.Close();
КонецФункции    // Копи85
//****** Кодер85 (Конец)

//****** ДеКодер85 (Начало)
Функция ВПрименить(Байт)
   Для к=1 По Байт Цикл
       Скрипт.ExecuteStatement("S=S & chr("+(Цел(Кортеж/МассивСдвига[к]) % 256)+")");
   КонецЦикла;
КонецФункции    // ВПрименить

Функция ДеКодер85(Пар)
   Кол=СтрДлина(Пар);
   Для к=1 По Кол Цикл
       с=КодСимв(Сред(Пар,к,1));
       Если с=КодСимв("z") Тогда
           Для ш=1 По 4 Цикл
               Скрипт.ExecuteStatement("S=S & chr(0)");
           КонецЦикла;
       ИначеЕсли Кол=к Тогда
           Если Количество>0 Тогда
               Кортеж=Кортеж+МассивДекодера[Количество];
               ВПрименить(Количество);
           КонецЕсли;
           Прервать;
       Иначе
           Количество=Количество+1;
           Кортеж=Кортеж+(с-33)*МассивДекодера[Количество];
           Если Количество=5 Тогда
               ВПрименить(4);
               Количество=0;
               Кортеж=0;
           КонецЕсли;
       КонецЕсли;
       Состояние(Индикатор(к,Кол));
   КонецЦикла;
КонецФункции    // ДеКодер85

Функция ДеКодирование(Файл)
   Кортеж=0;с=0;Количество=0;Стр="";
   Текст=СоздатьОбъект("Текст");
   Текст.Открыть(Файл);
   Кол=Текст.КоличествоСтрок();
   Для к=1 По Кол Цикл
       Стр=Стр+Текст.ПолучитьСтроку(к);
       Состояние(Индикатор(к,Кол));
   КонецЦикла;
   Если (Лев(Стр,2)="<~") и (Прав(Стр,2)="~>") Тогда
       Скрипт=СоздатьОбъект("MSScriptControl.ScriptControl");
       Скрипт.language="vbscript";
       Скрипт.ExecuteStatement("S=""""");
       ФайлОбъект=ФСО.OpenTextFile(Файл+".bin",2,-1);
       Стр=Сред(Стр,3,СтрДлина(Стр)-4);//
       ДеКодер85(Стр);
       Скрипт.AddObject("File",ФайлОбъект);
       Скрипт.ExecuteStatement("File.Write(S)");
       ФайлОбъект.Close();
   Иначе
       Сообщить("Файл не Аски85");
   КонецЕсли;
КонецФункции    // ДеКодирование
//****** ДеКодер85 (Конец)

Процедура ПриОткрытии()
   Перем Файл,Каталог;
   МассивСдвига[1]=16777216;
   МассивСдвига[2]=65536;
   МассивСдвига[3]=256;
   МассивСдвига[4]=1;
   Ширина=72;Позиция=0;Кортеж=0;Количество=0;
   ФСО=СоздатьОбъект("Scripting.FileSystemObject");
   Если ФС.ВыбратьФайл(0,Файл,Каталог,"","Все файлы (*.*)|*.*","")=1 Тогда
       Начало();
       Копи85(Каталог+Файл);
       Конец();
       Текст=СоздатьОбъект("Текст");
       Текст.ДобавитьСтроку(Стр);
       Текст.Записать(Каталог+Файл+".ascii85");
   Иначе
       Возврат;
   КонецЕсли;
   МассивДекодера[1]=85*85*85*85;
   МассивДекодера[2]=85*85*85;
   МассивДекодера[3]=85*85;
   МассивДекодера[4]=85;
   МассивДекодера[5]=1;
   ДеКодирование(Каталог+Файл+".ascii85");
   СтатусВозврата(0);
КонецПроцедуры    // ПриОткрытии
15 smaharbA
 
22.10.07
18:37

//*******************************************
Процедура Сформировать()
   Перем Путь,Имя;
   Если ФС.ВыбратьФайл(0,Имя,Путь,"","Все файлы (*.*)|*.*","")=0 Тогда
       Возврат;
   КонецЕсли;
   Скрипт=СоздатьОбъект("MSScriptControl.ScriptControl");
   Скрипт.language="javascript";
   Стрим=СоздатьОбъект("adodb.stream");
   Стрим.type=2;
   Стрим.charset="windows-1251";
   Стрим.Open();
   Стрим.LoadFromFile(Путь+Имя);
   Скрипт.AddObject("Стрим",Стрим);
   Стр=Скрипт.Eval("Стр=escape(Стрим.ReadText().toString())");
   Стрим.Close();
   Стрим.Open();
   Скрипт.Eval("Стрим.WriteText(unescape(Стр))");
   Стрим.SaveToFile(Путь+Имя+".1",2);
   Сообщить(СтрДлина(Стр));
   Стрим.Close();
   Скрипт.Reset();
КонецПроцедуры

быстрый метод без ВК, но избыточный размер строки, если скрестить с (14) но использовать методы мсскриптконтрол(джабаскрипт) то будет избыточность всего 25%