![]() |
Модераторы: LSD, AntonSaburov |
![]() ![]() ![]() |
|
bawukr |
|
|||
Новичок Профиль Группа: Участник Сообщений: 30 Регистрация: 4.8.2006 Репутация: нет Всего: нет |
Подскажите, как читать данные из бинароного файла.
Формат данных на Си выглядит так:
Как мне прочитать char длиной [64] байта и time_t ? Какая у time_t вообще длина (Подозреваю, что Long)? |
|||
|
||||
Entry_N3 |
|
|||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 446 Регистрация: 8.2.2007 Репутация: нет Всего: нет |
Это вопрос в разделе по Java?
Это сообщение отредактировал(а) Entry_N3 - 15.6.2007, 22:26 |
|||
|
||||
bawukr |
|
|||
Новичок Профиль Группа: Участник Сообщений: 30 Регистрация: 4.8.2006 Репутация: нет Всего: нет |
Да, т.к. такую структуру мне надо читать в JAVA
|
|||
|
||||
nornad |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1079 Регистрация: 16.2.2007 Где: в Караганде Репутация: 16 Всего: 31 |
char[64] - легко, если тупо 64 раза прочитать char time_t - если я правильно помню и ничего не путаю, то это long (в MSDN'е сказано, что это __int64 or long integer ![]() -------------------- Три достоинства программиста: Леность, Нетерпение и Гордость Ларри Уолл |
|||
|
||||
LSD |
|
|||
![]() Leprechaun Software Developer ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 15718 Регистрация: 24.3.2004 Где: Dublin Репутация: 210 Всего: 538 |
char - это что за тип данных (сколько байт занимает, какая кодировка, litle/big endian)? Тебе видней, что вообще за тип такой 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. |
|||
|
||||
nornad |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1079 Регистрация: 16.2.2007 Где: в Караганде Репутация: 16 Всего: 31 |
Да, не подумал, что в жабе char - юникодовский.
![]() Тут сишный char, а он один байт. Про time_t я уже сказал. В данном случае это тоже восьмибатовый лонг. -------------------- Три достоинства программиста: Леность, Нетерпение и Гордость Ларри Уолл |
|||
|
||||
bawukr |
|
|||
Новичок Профиль Группа: Участник Сообщений: 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 |
|||
|
||||
LSD |
|
|||
![]() Leprechaun Software Developer ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 15718 Регистрация: 24.3.2004 Где: Dublin Репутация: 210 Всего: 538 |
Забить на DataInputStream и сделать чтение вручную:
-------------------- 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. |
|||
|
||||
bawukr |
|
|||
Новичок Профиль Группа: Участник Сообщений: 30 Регистрация: 4.8.2006 Репутация: нет Всего: нет |
Последний раз помучаю Вас.
![]() А как, тоже самое только для Double делать? |
|||
|
||||
LSD |
|
||||
![]() Leprechaun Software Developer ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 15718 Регистрация: 24.3.2004 Где: Dublin Репутация: 210 Всего: 538 |
Элементарно:
или так:
смотря какой порядок байт используется 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. |
||||
|
|||||
math64 |
|
|||
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 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"); Между полями структуры могут для выравнивания быть вставлены пустые байты, которые нужно пропускать. |
|||
|
||||
![]() ![]() ![]() |
Правила форума "Java" | |
|
Если Вам помогли, и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, LSD, AntonSaburov, powerOn, tux, javastic. |
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
0 Пользователей: | |
« Предыдущая тема | Java: Общие вопросы | Следующая тема » |
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |