powered by simpleCommunicator - 2.0.57     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Java [игнор отключен] [закрыт для гостей] / Обработка бинарных файлов.
11 сообщений из 11, страница 1 из 1
Обработка бинарных файлов.
    #32673384
alex-ikar
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Всем привет!
Нужно загрузить в базу информацию из бинарных файлов.
Файлы имеет фиксированную структуру.
Размер каждой записи = 190 байт.
В нутри каждой записи вся инфа разбита по полям .

А как значение буфера раскидать по переменным или в класс?
(Например: первые 4 байта в переменную int, c 5 по 16 байты в переменную String,.....)

В С++ это все просто реализуется с помощью структур и UNION.
Я здесь попытался че-то изобразить.
Но пока получается только считывать в цикле в буфер. А как дальше быть не знаю. :(
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
    java.io.File fileObject)
    java.io.InputStream fileS;
    byte[] tempBuf;
    int StartPos = 0;
    int recordCnt = 0;

    fileS = new java.io.FileInputStream(fileObject);
    tempBuf = new byte[191];

    while ( fileS.available() > 0 )
    {
        fileS.read(tempBuf, 0, 191);
    }

Заранее спасибо. И все-такое. :))
...
Рейтинг: 0 / 0
Обработка бинарных файлов.
    #32673477
Фотография А.Гpacoff
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
а зачем массив 191 байт? а не 190?

сложного совсем нет ничего. прочитал в массив 190 байт.
если первые 4 типа int - ручками их преобразуешь в явовский
инт (в смысле в твоем файле может идти сначала старший байт,
либо сначала младший).

например, формат BMP (картинки) имеет в своих записях четырех-
байтовый int :) чтобы получить для джавы (как вариант):

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
  private int getBMPInt(byte b0, byte b1, byte b2, byte b3) {
    int i0 = getInt(b0);
    int i1 = getInt(b1);
    int i2 = getInt(b2);
    int i3 = getInt(b3);

    return (i3 << 24) + (i2 << 16) + (i1 << 8) + i0;
  }

  private int getInt(byte b) {
    if (b >= 0)
      return b;
    return 256 + b;
  }

--
{forum.auto.signature}
...
Рейтинг: 0 / 0
Обработка бинарных файлов.
    #32673883
alex-ikar
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
2А.Гpacoff
Большое спасибо!

2All
В продолжении своего вопроса:
- известно что массиве tempBuf в который я считываю данные из файла, с 20 по 35 байты находится запись в BCD-формате.
Как бы мне её значение в строковую переменную засунуть?
...
Рейтинг: 0 / 0
Обработка бинарных файлов.
    #32674201
NotGonnaGetUs
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
руками :) Специальных методов для этого нет.
...
Рейтинг: 0 / 0
Обработка бинарных файлов.
    #32674215
alex-ikar
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Это-то понятно что нет.

Вы мне лучше скажите можно ли что-нить аналогчное на Джаве сделать и как
(а то я из-за недостатка опыта не врубаюсь чего-то)

Код: plaintext
1.
2.
3.
  С++
  unsigned char * bbuf;
  char * sbuf;
  sprintf( buf+(i<<1), "%02X", bbuf[i] );

т.е. если байт имеет значение 0х78 то и записать в строку "78", а не какую-то абракадабру.
...
Рейтинг: 0 / 0
Обработка бинарных файлов.
    #32674640
NotGonnaGetUs
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
byte b = 0x78;
System.out.println(Integer.toHexString(b)); ?
...
Рейтинг: 0 / 0
Обработка бинарных файлов.
    #32674649
NotGonnaGetUs
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Точнее
Код:
1.
2.
3.
4.
5.
StringBuffer sb = new StringBuffer();
for(int i=20;i<=35; i++){
     sb.append(Integer.toHexString(tempBuf ));
}
String result = sb.toString();

если уж в строку писать надо :)
...
Рейтинг: 0 / 0
Обработка бинарных файлов.
    #32676203
NotGonnaGetUs
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
patch:
tempBuf -> getInt(tempBuf )
:)
...
Рейтинг: 0 / 0
Обработка бинарных файлов.
    #32676649
alex-ikar
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Да у меня и в первом варианте неплохо работает. :))

Код: plaintext
1.
2.
3.
4.
5.
StringBuffer sb = new StringBuffer();
for(int i=20;i<=35; i++)
 {
   sb.append(Integer.toHexString(tempBuf[i] & 0xFF));
 }
String result = sb.toString();

Спасибо.
...
Рейтинг: 0 / 0
Обработка бинарных файлов.
    #32678286
NotGonnaGetUs
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
красиво
...
Рейтинг: 0 / 0
Обработка бинарных файлов.
    #32691827
GammiBear
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Еще такой вариант
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
....
byte[] data = getSomeDataFromSomhewere();
ByteArrayInputStream istr =  new ByteArrayInputStream(data);
DataInputStream obj_strm =  new  DataInputStream(istr);
 //DataInputStream уже умеет читать примитивные типы 
 //данных java - int,float,double,String etc. 

while(true){
    try{
         ......
         int n = obj_strm.readInt();
         byte b =  obj_strm.readByte();
         long l = obj_strm.readLong();
         .......
    }
    catch(EOFException e0){
           //EOF reached, exit; 
          break;
    }
    catch(Exception e){
           //handle other erros 
    }
}
......
...
Рейтинг: 0 / 0
11 сообщений из 11, страница 1 из 1
Форумы / Java [игнор отключен] [закрыт для гостей] / Обработка бинарных файлов.
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]