Бинарные Данные Из Файла R5

motogarri

Well-known member
17.02.2010
200
3
#1
В пятерке нужно получить из файла бинарную строку. Побайтное чтение работает, но только с маленькими файлами до мегабайта. Если файл больше, то очень долго отрабатывает. Файл 2.5 мб обрабатывался минут 20. Подскажите плс есть другие способы или я что-то не так делаю?
f = Freefile
Open fileName For Binary As f

While Not Eof(f)
Get #f,, n
binData = binData + Cstr(n) + Chr(13)
Wend
Бинарные данные нужны чтобы зашфровать внешним шифровальщиком и отправить по почте. На там конце расшифровать и снова собрать в файл.
 

Akupaka

А че я?.. О.о
04.10.2007
3 360
1
#4
Оу, прошу прощения, про версию я не учел.

А проблема во времени наверное из-за работы со строками: binData = binData + Cstr(n) + Chr(13)
Если не ошибаюсь, у нотеса это очень "слабое звено".

garri , попробуй создать документ с RT-полем и загонять в него порции binData , а не в строковую переменную. Возможно это улучшит время работы.
 

VladSh

начинающий
Lotus team
11.12.2009
1 262
6
#6
Тут StringBuffer для LS надо бы использовать, - к гадалке не ходи.
 

motogarri

Well-known member
17.02.2010
200
3
#7
StringBuffer хорошая штука, но тут надо вообще от цикла избавиться. Пытался ADODB.Stream прикрутить - ругается на переполнение массива.
 

ToxaRat

Чёрный маг
Lotus team
06.11.2007
3 231
18
#8
может лучше массив стрингов сделать тогда не будет складывания стринга и будет быстрее
 

motogarri

Well-known member
17.02.2010
200
3
#9
Да фиг его знает с этими массивами все-равно файл больше 32 кб не запихнешь.
 

ToxaRat

Чёрный маг
Lotus team
06.11.2007
3 231
18
#12
яж сказал - есть java !!!

Добавлено: не лотусиный стринг, а 32бит приложения ограничены (на нить не более 2Гб)
не дорогой, именно лотусиный стринг

на 64битном сервере в стринг больше 2Гб тоже не вписать
 

motogarri

Well-known member
17.02.2010
200
3
#15
Ниче не получается.
Решил идти в ногу со временем и перешел на шестерку))

1. Получаю Byte массив из файла buffer = stream.Read()
2. Пихаю его в CAPICOM. При этом CAPICOM из массива делает строку такого вида: �က䙊䙉Āā搀搀
3. Делаю с контетом CAPICOM разные действия (шифрую, подписываю)
4. Нужно вытащить строку из CAPICOM и собрать из нее исходный файл

В итоге чтобы на выходе получить исходный файл, нужно в поток засунуть тот же массив байтов, а у меня строка хрен знает какого вида и как из нее получить байты, да еще и не используя при этом циклы (слишком долго) фиг его знает.

Может я вообще не тем путем пошел?
 

ToxaRat

Чёрный маг
Lotus team
06.11.2007
3 231
18
#16
1. Получаю Byte массив из файла buffer = stream.Read()
2. Пихаю его в CAPICOM. При этом CAPICOM из массива делает строку такого вида: �က䙊䙉Āā搀搀
1) открывая стрим указывай КОДИРОВКУ - stream.Open(PathXML, "UTF-8")
2) Read() не юзать, а юзать sBuff = stream2.ReadText() - она хапнет сразу весь файл и быстро
 

motogarri

Well-known member
17.02.2010
200
3
#17
Все-таки стал делать на жаве. Скодировками запутался или еще в чем проблема.
Читаю из файла массив байтов, конвертирую в строку. В жаве строка нормальная, а в LS передается только первые 4 символа.
<div class="sp-wrap"><div class="sp-head-wrap"><div class="sp-head folded clickable">Java</div></div><div class="sp-body"><div class="sp-content">
C++:
public static String ReadFile(String filePath, String charset){
InputStream is = null;
byte[] buffer = null;
String data = "";

try{
//Чтение файла в массив байтов
is = new BufferedInputStream(new FileInputStream(filePath));
buffer = new byte[is.available()];
is.read(buffer);

//Конвертация массива байтов в строку
if (buffer != null) {
if (charset == ""){
data = new String(buffer, charset);
}else{
data = new String(buffer);
}	
}

is.close();
return data;

}catch(Exception e){
System.out.println("Unsupported character set");
return data;
} 
}
Код:
data = javaObject.ReadFile("C:\Users\ens\Desktop\Test\111.jpg")
data = javaObject.ReadFile("C:\Users\ens\Desktop\Test\111.jpg", "UTF-8")
 

lmike

нет, пердело совершенство
Lotus team
27.08.2008
6 586
272
#18
есть два момента...
- кодировка для бинарных файлов - это что-то неправильное ;)
- можно передавать массивы простых типов (получать в variant)


Добавлено: http://docs.oracle.com/javase/1.4.2/docs/a...nputStream.html
це другой случай (обшибся)
Добавлено: и что за хитрый криптограф - шо в java он не реализован?
 

lmike

нет, пердело совершенство
Lotus team
27.08.2008
6 586
272
#19
как-то вот так...
LS:
Код:
Option Public
Option Declare
Use "utils.file"
Use "ErrorHandling"
Class LS2Jfile As ErrorHandlerWJ
Private jobj As JAVAOBJECT
Private jclass As JAVACLASS
Sub New
On Error Goto ErrH
Set jclass=jsession.GetClass({utils/file/Processing})
Set jobj=jclass.CreateObject()
Quit:
Exit Sub
ErrH:
Error 1024, RaiseError
Resume Quit
End Sub
Function ReadFile(path As String)
On Error Goto ErrH
Dim v
v=jobj.ReadFile(path)
ReadFile=v
Quit:
Exit Function
ErrH:
Error 1024, RaiseError
Resume Quit
End Function
End Class
Sub Initialize
On Error Goto ErrH
Dim binobj As New LS2Jfile
Dim v
v=binobj.ReadFile({c:\imgOn.gif})
Print "byte array Ubound:" &Cstr(Ubound(v))
Quit:
Exit Sub
ErrH:
Error 1024, RaiseError
Resume Quit
End Sub
java (либа названа utils.file):<!--shcode--><pre><code class='java'>package utils.file;
import java.io.*;
public class Processing{
public static byte[] ReadFile(String filePath){
InputStream is = null;
byte[] buffer = null;
try{
//Чтение файла в массив байтов
is = new BufferedInputStream(new FileInputStream(filePath));
buffer = new byte[is.available()];
is.read(buffer);
is.close();
return buffer;
}catch(Exception e){
e.printStackTrace();
return null;
}
}
}[/CODE]
 

motogarri

Well-known member
17.02.2010
200
3
#20
Микросовтовский АктивХ capicom.dll. Если не разберусь, как передать строку в LS на джаве наверное все придется делать.
Для шифрования на вход берет сроку либо байтовый массив. Строку просто шифрует, а массив преобразовывает во что-то непонятное. Чтобы после всех действий (шифрование-расшифрование) собрать исходный файл нужно получить массив, а эта штука отдает только String. Причем файлы могут быть до 100мб.

У меня так получается:
1. В java чтение из файла массива байтов, конвертация в строку и передача в LS
2. В LS шифрование, передача адресату, расшифровка, передача расшифрованной строки в java
3. В java получение из строки массива байтов (как понял это byte[] buffer = data.getBytes();) и создание файла в Stream

Вот массив читается нормально, в троку пределывается тоже нормально (на как оказалось не больше 1 мб), а в LS передаются только первые 4 символа "яШяа"

Сейчас с еще одной проблемой столкнулся:
Код:
data = new String(buffer, charset);
Если byte[] buffer больше мегабайта - ошибка StackOverflowError
Это String ограничен мегабайтом?

Добавлено: lmike, вы меня опередили. Ща поразбираюсь.