2013-04-02 9 views
5

시간 구조를 FAT 타임 스탬프로 변환하려고합니다. 내 코드는 다음과 같습니다.유닉스 타임 스탬프 - FAT 타임 스탬프

unsigned long Fat(tm_struct pTime) 
{ 
    unsigned long FatTime = 0; 

    FatTime |= (pTime.seconds/2) >> 1; 
    FatTime |= (pTime.minutes) << 5; 
    FatTime |= (pTime.hours) << 11; 
    FatTime |= (pTime.days) << 16; 
    FatTime |= (pTime.months) << 21; 
    FatTime |= (pTime.years + 20) << 25; 

    return FatTime; 
} 

누군가 올바른 코드를 가지고 있습니까?

+0

무엇이 문제입니까? –

답변

10
The DOS date/time format is a bitmask: 

       24    16     8     0 
+-+-+-+-+-+-+-+-+ +-+-+-+-+-+-+-+-+ +-+-+-+-+-+-+-+-+ +-+-+-+-+-+-+-+-+ 
|Y|Y|Y|Y|Y|Y|Y|M| |M|M|M|D|D|D|D|D| |h|h|h|h|h|m|m|m| |m|m|m|s|s|s|s|s| 
+-+-+-+-+-+-+-+-+ +-+-+-+-+-+-+-+-+ +-+-+-+-+-+-+-+-+ +-+-+-+-+-+-+-+-+ 
\___________/\________/\_________/ \________/\____________/\_________/ 
    year  month  day  hour  minute  second 

The year is stored as an offset from 1980. 
Seconds are stored in two-second increments. 
(So if the "second" value is 15, it actually represents 30 seconds.) 

은 당신이 사용하고있는 tm_struct을 잘 모릅니다 만 인 경우에 http://www.cplusplus.com/reference/ctime/tm/

unsigned long FatTime = ((pTime.tm_year - 80) << 25) | 
         (pTime.tm_mon << 21) | 
         (pTime.tm_mday << 16) | 
         (pTime.tm_hour << 11) | 
         (pTime.tm_min << 5) | 
         (pTime.tm_sec >> 1); 
+0

'sizeof (int)'가 2 인 경우에 필요한 몇몇 타입 변환 (코드가 DOS 리얼 모드를위한 경우 여기에 해당 될 수 있음). –

+1

그리고 'signed'타입의 이동이 완전히 이식 가능하지 않기 때문에 'unsigned'타입으로 변환하는 것이 더 낫다. –

+0

FAT 타임 스탬프는 UTC 또는 현지 표준 시간대입니까? – rustyx

1

Lefteris E 거의 정답을하는 듯했으나 여기에 약간의 실수 때문에,

당신이 tm_mon에 1을 추가해야합니다입니다 tm struct는 0에서 11까지의 숫자로 월을 유지하지만 (struct tm), DOS 날짜/시간은 1에서 12까지 (FileTimeToDosDateTime)입니다. 너무 정확하게

unsigned long FatTime = ((pTime.tm_year - 80) << 25) | 
    ((pTime.tm_mon+1) << 21) | 
    (pTime.tm_mday << 16) | 
    (pTime.tm_hour << 11) | 
    (pTime.tm_min << 5) | 
    (pTime.tm_sec >> 1);