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

Тема в разделе "Lotus - Программирование", создана пользователем motogarri, 10 сен 2012.

  1. motogarri

    motogarri Well-Known Member

    Регистрация:
    17 фев 2010
    Сообщения:
    188
    Симпатии:
    4
    В пятерке нужно получить из файла бинарную строку. Побайтное чтение работает, но только с маленькими файлами до мегабайта. Если файл больше, то очень долго отрабатывает. Файл 2.5 мб обрабатывался минут 20. Подскажите плс есть другие способы или я что-то не так делаю?
    Бинарные данные нужны чтобы зашфровать внешним шифровальщиком и отправить по почте. На там конце расшифровать и снова собрать в файл.
     
  2. Akupaka

    Akupaka А че я?.. О.о

    Регистрация:
    4 окт 2007
    Сообщения:
    3.373
    Симпатии:
    2
    а NotesStream не подойдет?
     
  3. lmike

    lmike нет, пердело совершенство
    Команда форума Lotus team

    Регистрация:
    27 авг 2008
    Сообщения:
    6.082
    Симпатии:
    300
    -
    ну впринципе java доступна и в пятерке, тока нету бриджа (штатно)
     
  4. Akupaka

    Akupaka А че я?.. О.о

    Регистрация:
    4 окт 2007
    Сообщения:
    3.373
    Симпатии:
    2
    Оу, прошу прощения, про версию я не учел.

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

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

    motogarri Well-Known Member

    Регистрация:
    17 фев 2010
    Сообщения:
    188
    Симпатии:
    4
    Ок, спасибо попробую
     
  6. VladSh

    VladSh начинающий
    Lotus team

    Регистрация:
    11 дек 2009
    Сообщения:
    1.251
    Симпатии:
    2
    Тут StringBuffer для LS надо бы использовать, - к гадалке не ходи.
     
  7. motogarri

    motogarri Well-Known Member

    Регистрация:
    17 фев 2010
    Сообщения:
    188
    Симпатии:
    4
    StringBuffer хорошая штука, но тут надо вообще от цикла избавиться. Пытался ADODB.Stream прикрутить - ругается на переполнение массива.
     
  8. ToxaRat

    ToxaRat Чёрный маг
    Lotus team

    Регистрация:
    6 ноя 2007
    Сообщения:
    3.047
    Симпатии:
    18
    может лучше массив стрингов сделать тогда не будет складывания стринга и будет быстрее
     
  9. motogarri

    motogarri Well-Known Member

    Регистрация:
    17 фев 2010
    Сообщения:
    188
    Симпатии:
    4
    Да фиг его знает с этими массивами все-равно файл больше 32 кб не запихнешь.
     
  10. ToxaRat

    ToxaRat Чёрный маг
    Lotus team

    Регистрация:
    6 ноя 2007
    Сообщения:
    3.047
    Симпатии:
    18
    лотусиный стринг ограничен 2Гб
     
  11. lmike

    lmike нет, пердело совершенство
    Команда форума Lotus team

    Регистрация:
    27 авг 2008
    Сообщения:
    6.082
    Симпатии:
    300
    яж сказал - есть java !!!

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

    ToxaRat Чёрный маг
    Lotus team

    Регистрация:
    6 ноя 2007
    Сообщения:
    3.047
    Симпатии:
    18
    не дорогой, именно лотусиный стринг

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

    lmike нет, пердело совершенство
    Команда форума Lotus team

    Регистрация:
    27 авг 2008
    Сообщения:
    6.082
    Симпатии:
    300
    ты уверен что LS VM работает в 64 бит моде :huh:?
    я что-то - нет
     
  14. motogarri

    motogarri Well-Known Member

    Регистрация:
    17 фев 2010
    Сообщения:
    188
    Симпатии:
    4
    Да, я помню. Оставил напоследок, когда все свои виндолюбские комовские примочки исчерпаю, пойму что фигня и тогда..))
     
  15. motogarri

    motogarri Well-Known Member

    Регистрация:
    17 фев 2010
    Сообщения:
    188
    Симпатии:
    4
    Ниче не получается.
    Решил идти в ногу со временем и перешел на шестерку))

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

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

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

    ToxaRat Чёрный маг
    Lotus team

    Регистрация:
    6 ноя 2007
    Сообщения:
    3.047
    Симпатии:
    18
    1) открывая стрим указывай КОДИРОВКУ - stream.Open(PathXML, "UTF-8")
    2) Read() не юзать, а юзать sBuff = stream2.ReadText() - она хапнет сразу весь файл и быстро
     
  17. motogarri

    motogarri Well-Known Member

    Регистрация:
    17 фев 2010
    Сообщения:
    188
    Симпатии:
    4
    Все-таки стал делать на жаве. Скодировками запутался или еще в чем проблема.
    Читаю из файла массив байтов, конвертирую в строку. В жаве строка нормальная, а в 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;
    }
    }
    Код (LotusScript):
    data = javaObject.ReadFile("C:\Users\ens\Desktop\Test\111.jpg")
    data = javaObject.ReadFile("C:\Users\ens\Desktop\Test\111.jpg", "UTF-8")
     
  18. lmike

    lmike нет, пердело совершенство
    Команда форума Lotus team

    Регистрация:
    27 авг 2008
    Сообщения:
    6.082
    Симпатии:
    300
    есть два момента...
    - кодировка для бинарных файлов - это что-то неправильное ;)
    - можно передавать массивы простых типов (получать в variant)


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

    lmike нет, пердело совершенство
    Команда форума Lotus team

    Регистрация:
    27 авг 2008
    Сообщения:
    6.082
    Симпатии:
    300
    как-то вот так...
    LS:
    Код (LotusScript):
    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]
     
  20. motogarri

    motogarri Well-Known Member

    Регистрация:
    17 фев 2010
    Сообщения:
    188
    Симпатии:
    4
    Микросовтовский АктивХ capicom.dll. Если не разберусь, как передать строку в LS на джаве наверное все придется делать.
    Для шифрования на вход берет сроку либо байтовый массив. Строку просто шифрует, а массив преобразовывает во что-то непонятное. Чтобы после всех действий (шифрование-расшифрование) собрать исходный файл нужно получить массив, а эта штука отдает только String. Причем файлы могут быть до 100мб.

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

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

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

    Добавлено: lmike, вы меня опередили. Ща поразбираюсь.
     
Загрузка...
Похожие Темы - Бинарные Данные Из
  1. fantom0005
    Ответов:
    0
    Просмотров:
    1.263
  2. Bafomet
    Ответов:
    0
    Просмотров:
    19
  3. maliy
    Ответов:
    17
    Просмотров:
    160
  4. Anatoly
    Ответов:
    24
    Просмотров:
    391
  5. Shouldercannon
    Ответов:
    0
    Просмотров:
    492

Поделиться этой страницей