Ru-Board.club
← Вернуться в раздел «Прикладное программирование»

» Формат времени/даты FAT32

Автор: Vygose
Дата сообщения: 18.05.2010 04:28
Не получается получить правильную дату/время файла, хотя программка DCode переводит верно.
Например: b23c (дата) b713 (время), должно получиться 18/MAY/2010 2:29:46, но не получается. Подскажите плз, как раскодировать этот формат.

Вот к примеру описание формата времени:

Формат Времени. Штамп времени директории FAT - это 16-битное поле, имеющее кратность 2 секунды. Описание формата (бит 0 младший в 16-битном слове, бит 15 старший в 16-битном слове).

Биты 0–4: 2-секундный счётчик, допустимый диапазон 0–29 включительно (0 – 58 секунд).
Биты 5–10: Минуты, допустимый диапазон 0–59 включительно.
Биты 11–15: Часы, допустимый диапазон 0–23 включительно.
Автор: YuriyRR
Дата сообщения: 18.05.2010 04:50
см
GetFileTime
FileTimeToLocalFileTime
FileTimeToSystemTime

The FILETIME structure is a 64-bit value representing the number of 100-nanosecond intervals since January 1, 1601.

typedef struct _FILETIME { // ft
DWORD dwLowDateTime;
DWORD dwHighDateTime;
} FILETIME;

The FAT and New Technology file systems support the file creation, last access, and last write time values.

Откуда такие 16 битные структуры?
Автор: Vygose
Дата сообщения: 18.05.2010 05:08
Не думаю, что мы говорим об одном и том же. Гляньте табличку: http://en.wikipedia.org/wiki/File_Allocation_Table#Directory_table
Смещения 0x0e и 0x10
Автор: Abs62
Дата сообщения: 18.05.2010 17:58

Цитата:
Например: b23c (дата) b713 (время), должно получиться 18/MAY/2010 2:29:46, но не получается.

Нет. 3CB2 и 13B7 соответственно. На диске это будет выглядеть как B7 13 B2 3C - младший байт идёт первым. Не тут ли загвоздка?
Вот пример на C++
[more]
Код: #include <iostream>

using namespace std;

union fatdate {
unsigned short value;
struct {
unsigned int day:5;
unsigned int month:4;
unsigned int year:7;
} fd;
};

union fattime {
unsigned short value;
struct {
unsigned int sec2:5;
unsigned int min:6;
unsigned int hour:5;
} ft;
};

int main(void)
{
fatdate f;
f.value=0x3cb2;
cout<<f.fd.day<<'/'<<f.fd.month<<'/'<<f.fd.year+1980<<endl;
fattime f2;
f2.value=0x13b7;
cout<<f2.ft.hour<<':'<<f2.ft.min<<':'<<f2.ft.sec2*2<<endl;
}
Автор: Vygose
Дата сообщения: 18.05.2010 22:51
А как определить, нужно ли менять порядок?
Автор: Abs62
Дата сообщения: 18.05.2010 23:11
Vygose
В данном случае надо просто знать.
FAT - это разработка для IBM PC, то бишь процессоры x86, а они работают с данными именно в таком формате - Little Endian, младший байт первым.
Автор: Vygose
Дата сообщения: 19.05.2010 00:03
ага, то есть менять и не париться?) есть какой-нибудь удобный способ это делать? по-индийски не хочется...
Автор: Abs62
Дата сообщения: 19.05.2010 00:24
Дык, считывать не побайтно, а сразу слово. Само в нужном порядке выстроится.
Автор: Vygose
Дата сообщения: 19.05.2010 00:29
можно чутка разжевать?) как так считывать сразу чтобы в нужном порядке?
Автор: Abs62
Дата сообщения: 19.05.2010 00:39
Vygose
А как оно сейчас считывается?
Автор: Vygose
Дата сообщения: 19.05.2010 00:51
readfile в массив байт
Автор: Abs62
Дата сообщения: 19.05.2010 01:21
Vygose
Ну тогда проще будет что-нибудь вроде этого

Код: unsigned short value=((unsigned short)high_byte<<8) | low_byte;
Автор: Vygose
Дата сообщения: 19.05.2010 03:56
Спасибо

Страницы: 1

Предыдущая тема: множественный выбор в Cxgrid


Форум Ru-Board.club — поднят 15-09-2016 числа. Цель - сохранить наследие старого Ru-Board, истории становления российского интернета. Сделано для людей.