Модераторы: LSD, AntonSaburov
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Форматированный бинарный файловый ввод вывод, Как? 
:(
    Опции темы
zone51
Дата 9.12.2006, 00:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 370
Регистрация: 17.2.2006

Репутация: нет
Всего: 1



Уважаемые форумчане! Очень нужно узнать как осуществить форматированный ввод с файла, ну и вывод тоже. В общем есть поля в классе, все поля разной длины, и надо из бинарного файла, вытаскивать определенные блоки байт и запихивать их в переменные класса. Смысл задачи в том что есть бинарники, в которые зашиты структуры С, и надо эти структуры оттуда выдрать но уже в яву. Размеры и последовательность записей известны. Спасибо. Буду рад любой помощи.


--------------------
The truth is out there
PM MAIL   Вверх
LSD
Дата 9.12.2006, 02:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Leprechaun Software Developer
****


Профиль
Группа: Модератор
Сообщений: 15718
Регистрация: 24.3.2004
Где: Dublin

Репутация: 210
Всего: 538



RandomAccessFile или FileChanel, в зависимости от того какие там структуры.


--------------------
Disclaimer: this post contains explicit depictions of personal opinion. So, if it sounds sarcastic, don't take it seriously. If it sounds dangerous, do not try this at home or at all. And if it offends you, just don't read it.
PM MAIL WWW   Вверх
zone51
Дата 9.12.2006, 02:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 370
Регистрация: 17.2.2006

Репутация: нет
Всего: 1



LSD
Структуры самые простые.вот к примеру.

        long NT;
        short DC;
        short MD;
        long VA;
        short VN;
        short DL;

Был бы очень рад если бы Вы мне привели пример пользования названными классами с учетом моей задачи, горю просто. Спасибо.

зы. Понимаете, мне надо что то наподобие функции fscanf в си. Форматная строка и все такое. smile 

Это сообщение отредактировал(а) zone51 - 9.12.2006, 02:28


--------------------
The truth is out there
PM MAIL   Вверх
LSD
Дата 9.12.2006, 02:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Leprechaun Software Developer
****


Профиль
Группа: Модератор
Сообщений: 15718
Регистрация: 24.3.2004
Где: Dublin

Репутация: 210
Всего: 538



Код
    RandomAccessFile randomAccessFile = new RandomAccessFile("somefile", "r");
    byte[] buffer = new byte[24];
    randomAccessFile.seek(24 * 10);
    randomAccessFile.readFully(buffer);
    long NT = ((buffer[0] & 0xFFL) << 56) +
              ((buffer[1] & 0xFFL) << 48) +
              ((buffer[2] & 0xFFL) << 40) +
              ((buffer[3] & 0xFFL) << 32) +
              ((buffer[4] & 0xFFL) << 24) +
              ((buffer[5] & 0xFFL) << 16) +
              ((buffer[6] & 0xFFL) <<  8) +
              ((buffer[7] & 0xFFL) <<  0);
    short DC = (short) (((buffer[8] & 0xFF) << 8) + ((buffer[9] & 0xFF) << 0));
....

Только про порядок байт не забудь.


--------------------
Disclaimer: this post contains explicit depictions of personal opinion. So, if it sounds sarcastic, don't take it seriously. If it sounds dangerous, do not try this at home or at all. And if it offends you, just don't read it.
PM MAIL WWW   Вверх
zone51
Дата 9.12.2006, 02:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 370
Регистрация: 17.2.2006

Репутация: нет
Всего: 1



LSD
Спасибо, а тока че 24 байта а не 16? И если Вас не затруднит, может быть Вы дадите хоть краткую характеристику проделанных Вами операций сдвига и битового и, что то не вьехал. Спасибо.

зы. 
((buffer[0] & 0xFFL) << 56)
а FFL это ваще какая система счисления? 
размер лонга 4 байта. сшорта-2. И в программе это прошито
Просто моя прога которую я перевожу под яву написана оочень давно-в 96-м.
Я вообще не понимаю 
buffer[0] & 0xFFL
buffer[8] & 0xFF
Ведь биты остаются точно такими же. И сдвиги на 56-это равносильно умножению на 2 в степени 56?

Это сообщение отредактировал(а) zone51 - 9.12.2006, 03:32


--------------------
The truth is out there
PM MAIL   Вверх
LSD
Дата 9.12.2006, 13:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Leprechaun Software Developer
****


Профиль
Группа: Модератор
Сообщений: 15718
Регистрация: 24.3.2004
Где: Dublin

Репутация: 210
Всего: 538



Цитата(zone51 @  9.12.2006,  02:39 Найти цитируемый пост)
Спасибо, а тока че 24 байта а не 16?

А поему там должно быть 16? Два long и два short = 24 байта. Просто я показал только для первых переменных, надо еще для остальных написать.

Цитата(zone51 @  9.12.2006,  02:39 Найти цитируемый пост)
Я вообще не понимаю 
buffer[0] & 0xFFL
buffer[8] & 0xFF
Ведь биты остаются точно такими же. И сдвиги на 56-это равносильно умножению на 2 в степени 56?

В Java расширение byte до int или long знаковое, соответвенно байт 0xFF будет расширен до 0xFFFFFFFF или 0xFFFFFFFFFFFFFFFF. А когда мы делаем buffer[0] & 0xFFL мы это предотвращаем.

Цитата(zone51 @  9.12.2006,  02:39 Найти цитируемый пост)
а FFL это ваще какая система счисления?

Чего?

Добавлено @ 13:04 
Цитата(zone51 @  9.12.2006,  02:39 Найти цитируемый пост)
И сдвиги на 56-это равносильно умножению на 2 в степени 56?

Да, только это быстрее.


--------------------
Disclaimer: this post contains explicit depictions of personal opinion. So, if it sounds sarcastic, don't take it seriously. If it sounds dangerous, do not try this at home or at all. And if it offends you, just don't read it.
PM MAIL WWW   Вверх
zone51
Дата 9.12.2006, 19:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 370
Регистрация: 17.2.2006

Репутация: нет
Всего: 1



LSD
Цитата

А поему там должно быть 16? Два long и два short = 24 байта. 

Нет, извините, но там именно 16.
Привожу фрагменты программы.
Код

 struct
   {
     long   NT;
     short  DC;
     short  MD;
     long   VA;
     short  VN;
     short  DL;
   } M1P;


Код

  while ( fread(&M1P.NT,16,1,mxb) )
        {
  SQLCODE=0;
#ifdef __ES__
               mpclong(&M1P.NT);
               mpcshrt(&M1P.DC);
               mpcshrt(&M1P.MD);
               mpclong(&M1P.VA);
               mpcshrt(&M1P.VN);
               mpcshrt(&M1P.DL);
#else
  SQLCODE=0;
#endif
          BNT = M1P.NT;
          if (BNT>=2000000 && BNT<=2999999)
              BNT=BNT-2000000;
/*        if (BNT>=200000 && BNT<=299999)
              BNT=BNT-200000;       */
          BDC = M1P.DC;
          BMD = M1P.MD;
          BVA = M1P.VA;
          BVN = M1P.VN;
          BDL = M1P.DL;
          SQLCODE=0;
          if (BDL==0) continue;
          if (BNT>9999999) continue;
          if (BNT<=0) continue;
          EXEC SQL INSERT INTO M1P(NT,DC,MD,VA,VN,DL)
          VALUES(:BNT,:BDC,:BMD,:BVA,:BVN,:BDL);
          if (SQLCODE!=0) printf("%+d %c \n",SQLCODE,sqlca.sqlerrmc);
          ci++;
          cc++;
          if ( cc >= 1000)
             { EXEC SQL COMMIT;
               printf("Loaded  NT=%7lu, %6lu records \n",BNT,ci);
               cc = 0;
             }
        }


while ( fread(&M1P.NT,16,1,mxb) )
Считываются именно 16 байт, лонг=4 байта, сшорт=2 байта. просто эта программа писалась не для компов а для телефонных АТС. И бинарники эти генерируют АТС. Поэтому такие типы. 
Спасибо.

Это сообщение отредактировал(а) LSD - 10.12.2006, 12:16


--------------------
The truth is out there
PM MAIL   Вверх
LSD
Дата 10.12.2006, 00:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Leprechaun Software Developer
****


Профиль
Группа: Модератор
Сообщений: 15718
Регистрация: 24.3.2004
Где: Dublin

Репутация: 210
Всего: 538



Цитата(zone51 @  9.12.2006,  19:41 Найти цитируемый пост)
Считываются именно 16 байт, лонг=4 байта, сшорт=2 байта. просто эта программа писалась не для компов а для телефонных АТС. И бинарники эти генерируют АТС. Поэтому такие типы. 

Ну так надо это дело уточнять. В Java: long - 8 байт, short - 2. И кстати а просто int тогда сколько?


--------------------
Disclaimer: this post contains explicit depictions of personal opinion. So, if it sounds sarcastic, don't take it seriously. If it sounds dangerous, do not try this at home or at all. And if it offends you, just don't read it.
PM MAIL WWW   Вверх
zone51
Дата 10.12.2006, 00:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 370
Регистрация: 17.2.2006

Репутация: нет
Всего: 1



LSD
В сырцах я ваще инта не видел-не могу сказать.
Могу предложить бинарный файл, сырец целиком извините не могу-чревато. Но в предыдущем посте видно как читает поэтому думаю проблем не будет. Посмотрите пожалуйста. Спасибо.

http://slil.ru/23545669


--------------------
The truth is out there
PM MAIL   Вверх
LSD
Дата 10.12.2006, 12:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Leprechaun Software Developer
****


Профиль
Группа: Модератор
Сообщений: 15718
Регистрация: 24.3.2004
Где: Dublin

Репутация: 210
Всего: 538



Зачем мне бинарный файл, что я с ним делать буду.

Вот код для чтения данных из потока:
Код
public class ReadData
{
  public static M1P readM1P(DataInputStream in) throws IOException
  {
    M1P m1p = new M1P();
    byte[] b = new byte[M1P.SIZE];
    in.readFully(b);
    m1p.NT = ((b[0] & 0xFF) << 24) + ((b[1] & 0xFF) << 16) + ((b[2] & 0xFF) << 8) + (b[3] & 0xFF);
    m1p.DC = (short) (((b[4] & 0xFF) << 8) + (b[5] & 0xFF));
    m1p.MD = (short) (((b[6] & 0xFF) << 8) + (b[7] & 0xFF));
    m1p.VA = ((b[8] & 0xFF) << 24) + ((b[9] & 0xFF) << 16) + ((b[10] & 0xFF) << 8) + (b[11] & 0xFF);
    m1p.VN = (short) (((b[12] & 0xFF) << 8) + (b[13] & 0xFF));
    m1p.DL = (short) (((b[14] & 0xFF) << 8) + (b[15] & 0xFF));
    return m1p;
  }

  public static class M1P
  {
    public static final int SIZE = 16;

    public int NT;
    public short DC;
    public short MD;
    public int VA;
    public short VN;
    public short DL;
  }
}

Два но:
  • порядок байт big-endian, если надо little-endian, то надо заменить 
    Код
    m1p.NT = ((b[0] & 0xFF) << 24) + ((b[1] & 0xFF) << 16) + ((b[2] & 0xFF) << 8) + (b[3] & 0xFF);

    на
    Код
    m1p.NT = ((b[3] & 0xFF) << 24) + ((b[2] & 0xFF) << 16) + ((b[1] & 0xFF) << 8) + (b[0] & 0xFF);

    и т.д.
  • числа трактуются как знаковые



--------------------
Disclaimer: this post contains explicit depictions of personal opinion. So, if it sounds sarcastic, don't take it seriously. If it sounds dangerous, do not try this at home or at all. And if it offends you, just don't read it.
PM MAIL WWW   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Java"
LSD   AntonSaburov
powerOn   tux
javastic
  • Прежде, чем задать вопрос, прочтите это!
  • Книги по Java собираются здесь.
  • Документация и ресурсы по Java находятся здесь.
  • Используйте теги [code=java][/code] для подсветки кода. Используйтe чекбокс "транслит", если у Вас нет русских шрифтов.
  • Помечайте свой вопрос как решённый, если на него получен ответ. Ссылка "Пометить как решённый" находится над первым постом.
  • Действия модераторов можно обсудить здесь.
  • FAQ раздела лежит здесь.

Если Вам помогли, и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, LSD, AntonSaburov, powerOn, tux, javastic.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Java: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0866 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.