Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
Форум программистов > Java: Общие вопросы > Чтение бинарного файла |
Автор: bawukr 15.6.2007, 21:29 | ||
Подскажите, как читать данные из бинароного файла. Формат данных на Си выглядит так:
Как мне прочитать char длиной [64] байта и time_t ? Какая у time_t вообще длина (Подозреваю, что Long)? |
Автор: Entry_N3 15.6.2007, 22:25 |
Это вопрос в разделе по Java? |
Автор: bawukr 15.6.2007, 22:31 |
Да, т.к. такую структуру мне надо читать в JAVA |
Автор: nornad 16.6.2007, 00:53 |
char[64] - легко, если тупо 64 раза прочитать char time_t - если я правильно помню и ничего не путаю, то это long (в MSDN'е сказано, что это __int64 or long integer ![]() |
Автор: nornad 16.6.2007, 14:00 |
Да, не подумал, что в жабе char - юникодовский. ![]() Тут сишный char, а он один байт. Про time_t я уже сказал. В данном случае это тоже восьмибатовый лонг. |
Автор: bawukr 17.6.2007, 03:30 |
Вот насчет litle/big endian, я как то не подумал... сижу сейчас мучаюсь.. читайю файл так: DataInputStream din = new DataInputStream( new FileInputStream(xfile)); int version = din.readInt(); Знаю что в самом начале файла сохранен тип Int со значением 400. Но когда читаю выше указаным способом, получаю билеберду в виде -1878982656 Насколько я понял, друшлянул я как раз в litle/big endian Подскажите, что надо сделать? |
Автор: LSD 17.6.2007, 13:05 | ||
Забить на DataInputStream и сделать чтение вручную:
|
Автор: bawukr 18.6.2007, 16:23 |
Последний раз помучаю Вас. ![]() А как, тоже самое только для Double делать? |
Автор: LSD 18.6.2007, 19:49 | ||||
Элементарно:
или так:
смотря какой порядок байт используется C++. |
Автор: math64 19.6.2007, 12:29 |
Во всех известных мне компиляторах 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"); Между полями структуры могут для выравнивания быть вставлены пустые байты, которые нужно пропускать. |