|
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%
|
|