본문 바로가기

Programming Logs/Windows

unix 시간을 windows의 FILETIME으로 변환하기

tar unpack 과정에서 생긴 일이다

TarHeader 는 512 byte로 구성되어 있는데 내부에 12바이트 크기(char[12])의 modify time(mtime)이 들어있다

이는 unixTime 기반으로 windows에서 바로 사용하기 어렵다

일단 octet이므로 한번 integer 변환해줘야 하며, 이후 변환된 integer를 다시 한번 window time으로 바꿔줘야 한다

 

아래는 예시 코드이다

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
#include <winbase.h>
#include <winnt.h>
#include <time.h>
 
//...
 
{
 
    //...
 
    // get time 
 
    time_t unixTime = getval8(pTarBlock->mtime, 12); 
    FILETIME winTime; 
    UnixTimeToFileTime(unixTime, winTime);
 
    //...
 
}
 
//    ________________________________________________________________________________________________
void UnixTimeToFileTime(time_t t, LPFILETIME pft)
{
    // Note that LONGLONG is a 64-bit value
    LONGLONG ll;
 
    ll = Int32x32To64(t, 10000000+ 116444736000000000;
    pft->dwLowDateTime = (DWORD)ll;
    pft->dwHighDateTime = ll >> 32;
}
 
//    ________________________________________________________________________________________________
static unsigned long getval8(char *p, size_t siz)
{
    char buf[512];
    unsigned long val;
    int i;
 
    if (siz>512 || siz <=0){
    }
 
    for(i=0; i < (int)siz; i++){
        if (!isspace(p[i])) /* '\0' is control character */
            break;
    }
 
    memcpy(buf, p+i, siz-i);
    buf[siz-i]='\0';
 
    val=strtoul(buf, NULL8);
 
    return val;
}
 
cs

 

 

---

ref

---

https://support.microsoft.com/ko-kr/help/167296/how-to-convert-a-unix-time-t-to-a-win32-filetime-or-systemtime

 

https://support.microsoft.com/ko-kr/help/167296/how-to-convert-a-unix-time-t-to-a-win32-filetime-or-systemtime

쿠키가 사용되고 있지 않습니다. 쿠키를 사용하고 페이지를 새로 고치세요.

support.microsoft.com

 

'Programming Logs > Windows' 카테고리의 다른 글

LoadLibrary, FreeLibrary, GetModuleHandle  (0) 2019.12.26
왜 System pid는 1이 아니고 4일까?  (0) 2019.12.08