MS Dos日時とは何か
zipファイルのバイナリなどで日時を表すために用いられる。
時刻と日付それぞれで2バイトの16進数で表す。
Pythonコード
MS Dos日付をパースするコードは以下の通り。
引数は2バイトのMS Dos日付をリトルエンディアンで取得して整数に変換したものとする。
#int_ms_dos_date is 2-Byte or lower integer
def get_date_from_ms_dos_date(int_ms_dos_date):
#Convert to 16 bit fixed length binary string
str_bin_ms_dos_date = format(int_ms_dos_date, '0>16b')
year = int(str_bin_ms_dos_date[0:7],2) + 1980
month = int(str_bin_ms_dos_date[7:11],2)
day = int(str_bin_ms_dos_date[11:16],2)
return(f"{year}/{month}/{day}")
MS Dos時刻をパースするコードは以下の通り。
引数は2バイトのMS Dos時刻をリトルエンディアンで取得して整数に変換したものとする。
#int_ms_dos_time is 2-Byte or lower integer
def get_time_from_ms_dos_time(int_ms_dos_time):
#Convert to 16 bit fixed length binary string
str_bin_ms_dos_time = format(int_ms_dos_time, '0>16b')
hour = int(str_bin_ms_dos_time[0:5],2)
minute = int(str_bin_ms_dos_time[5:11],2)
second = int(str_bin_ms_dos_time[11:16],2) * 2
return("%(num1)02d:%(num2)02d.%(num3)02d" % {"num1":hour,"num2" : minute,"num3":second})
使い方
import struct
with open(zip_file_name, 'rb') as zip_file:
data = zip_file.read(14)
fields = struct.unpack('<IHHHHH', data[0:14])
#get a little-endian Dos-Date-Time value as integer
header_signature,version,bit_flag,compression_method,int_last_modification_time,int_last_modification_date = fields
#get result as a string
last_modification_date = get_date_from_ms_dos_date(int_last_modification_date)
last_modification_time = get_time_from_ms_dos_time(int_last_modification_time)
ハマったところ
フォーマット情報を見つけることができたが、内容があまり理解できなかった。
→具体的にサンプルを作って理解した。
参考