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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Чтение бинарного файла, char x[64] , time_t 
:(
    Опции темы
bawukr
Дата 15.6.2007, 21:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Подскажите, как читать данные из бинароного файла.

Формат данных на Си выглядит так:

Код

struct Header
  {
   int               version;
   char              copyright[64];
   char              symbol[12];
   time_t            timesign;
   int               unused[13];
  };


Как мне прочитать char длиной [64] байта и  time_t ? Какая у time_t вообще длина (Подозреваю, что Long)?
PM MAIL   Вверх
Entry_N3
Дата 15.6.2007, 22:25 (ссылка) |   (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Это вопрос в разделе по Java?

Это сообщение отредактировал(а) Entry_N3 - 15.6.2007, 22:26
PM MAIL   Вверх
bawukr
Дата 15.6.2007, 22:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Да, т.к. такую структуру мне надо читать в JAVA
PM MAIL   Вверх
nornad
Дата 16.6.2007, 00:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1079
Регистрация: 16.2.2007
Где: в Караганде

Репутация: 16
Всего: 31



Цитата(bawukr @  16.6.2007,  00:29 Найти цитируемый пост)
Как мне прочитать char длиной [64] байта и  time_t ?

char[64] - легко, если тупо 64 раза прочитать char
time_t - если я правильно помню и ничего не путаю, то это long (в MSDN'е сказано, что это __int64 or long integer  smile )


--------------------
Три достоинства программиста: Леность, Нетерпение и Гордость
Ларри Уолл
PM MAIL WWW ICQ Skype MSN   Вверх
LSD
Дата 16.6.2007, 09:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Leprechaun Software Developer
****


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

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



Цитата(bawukr @  15.6.2007,  22:29 Найти цитируемый пост)
Как мне прочитать char длиной [64] байта и  time_t ? Какая у time_t вообще длина (Подозреваю, что Long)?

char - это что за тип данных (сколько байт занимает, какая кодировка, litle/big endian)?
Цитата(bawukr @  15.6.2007,  22:29 Найти цитируемый пост)
Какая у time_t вообще длина (Подозреваю, что Long)?

Тебе видней, что вообще за тип такой timesign. В Java время хранится в виде целого long (8 байт), а вот как оно хранится в C тебе видней.

Если ты четко объяснишь в каком формате хранятся данные (количество и порядок байт, формат и т.д.) то прочитать их не проблема.


--------------------
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   Вверх
nornad
Дата 16.6.2007, 14:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1079
Регистрация: 16.2.2007
Где: в Караганде

Репутация: 16
Всего: 31



Да, не подумал, что в жабе char - юникодовский. smile
Тут сишный char, а он один байт.

Про time_t я уже сказал. В данном случае это тоже восьмибатовый лонг.


--------------------
Три достоинства программиста: Леность, Нетерпение и Гордость
Ларри Уолл
PM MAIL WWW ICQ Skype MSN   Вверх
bawukr
Дата 17.6.2007, 03:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Вот насчет litle/big endian, я как то не подумал... сижу сейчас мучаюсь..

читайю файл так:

DataInputStream din = new DataInputStream(
             new FileInputStream(xfile));
      
int version = din.readInt();


Знаю что в самом начале файла сохранен тип Int со значением 400.
Но когда читаю выше указаным способом, получаю билеберду в виде -1878982656

Насколько я понял, друшлянул я как раз в litle/big endian

Подскажите, что надо сделать?

Это сообщение отредактировал(а) bawukr - 17.6.2007, 12:31
PM MAIL   Вверх
LSD
Дата 17.6.2007, 13:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Leprechaun Software Developer
****


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

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



Цитата(bawukr @  17.6.2007,  04:30 Найти цитируемый пост)
Подскажите, что надо сделать?

Забить на DataInputStream и сделать чтение вручную:
Код
int ch1 = in.read();
int ch2 = in.read();
int ch3 = in.read();
int ch4 = in.read();
if((ch1 | ch2 | ch3 | ch4) < 0)
  throw new EOFException();
int result =  ((ch4 << 24) + (ch3 << 16) + (ch2 << 8) + (ch1 << 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   Вверх
bawukr
Дата 18.6.2007, 16:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Последний раз помучаю Вас.  smile 

А как, тоже самое только для Double делать?
PM MAIL   Вверх
LSD
Дата 18.6.2007, 19:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Leprechaun Software Developer
****


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

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



Цитата(bawukr @  18.6.2007,  17:23 Найти цитируемый пост)
А как, тоже самое только для Double делать?

Элементарно:
Код
long ch1 = in.read();
long ch2 = in.read();
long ch3 = in.read();
long ch4 = in.read();
long ch5 = in.read();
long ch6 = in.read();
long ch7 = in.read();
long ch8 = in.read();
if((ch1 | ch2 | ch3 | ch4 | ch5 | ch6 | ch7 | ch8) < 0)
  throw new EOFException();
long l = (ch8 << 56) + (ch7 << 48) + (ch6 << 40) + (ch5 << 32) + (ch4 << 24) + (ch3 << 16) + (ch2 << 8) + (ch1 << 0);
double d = Double.longBitsToDouble(l);

или так:
Код
long ch1 = in.read();
long ch2 = in.read();
long ch3 = in.read();
long ch4 = in.read();
long ch5 = in.read();
long ch6 = in.read();
long ch7 = in.read();
long ch8 = in.read();
if((ch1 | ch2 | ch3 | ch4 | ch5 | ch6 | ch7 | ch8) < 0)
  throw new EOFException();
long l = (ch1 << 56) + (ch2 << 48) + (ch3 << 40) + (ch4 << 32) + (ch5 << 24) + (ch6 << 16) + (ch7 << 8) + (ch8 << 0);
double d = Double.longBitsToDouble(l);

смотря какой порядок байт используется C++.


--------------------
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   Вверх
math64
Дата 19.6.2007, 12:29 (ссылка) |    (голосов:2) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2505
Регистрация: 12.4.2007

Репутация: 8
Всего: 72



Во всех известных мне компиляторах time_t  это 32 разрядный long, число секунд с 1 января 1970 года (0x7FFFFFFF - около 2036 года). В Java время считается от той же даты, но в миллисекундах и long - 64 разрядный. Нужно считать в int, учитывая litle/big endian, скопировать int в long, замаскировать старшие биты и умножить на 1000.
Строки считать в массив байт, найти конечный 0 и конвертировать в String: new String(bytes, 0, length, "Cp1251");
Между полями структуры могут для выравнивания быть вставлены пустые байты, которые нужно пропускать.
PM   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Java"
LSD   AntonSaburov
powerOn   tux
javastic
  • Прежде, чем задать вопрос, прочтите это!
  • Книги по Java собираются здесь.
  • Документация и ресурсы по Java находятся здесь.
  • Используйте теги [code=java][/code] для подсветки кода. Используйтe чекбокс "транслит", если у Вас нет русских шрифтов.
  • Помечайте свой вопрос как решённый, если на него получен ответ. Ссылка "Пометить как решённый" находится над первым постом.
  • Действия модераторов можно обсудить здесь.
  • FAQ раздела лежит здесь.

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

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


 




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


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

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