推 ephraim13825: 感謝大大 我完全想不到 完全卡在月份這 10/26 11:39
※ 引述《ephraim13825 (好喔)》之銘言:
: https://i.imgur.com/u0XoCBC.jpg
: 課堂上讓大家思考的邏輯題
: 想了很久都沒有頭緒 請問有板上高手可以出來解答一下嗎 拜託大家了
(Y-1980, 7bit)(M, 4bit)(D, 5bit) 的 16-bit 數字以 Little Endian 表示
3D 50 => 0x503D => 0101 0000 0011 1101 => 0101000 0001 11101 => 40 1 29
4E 4B => 0x4B4E => 0100 1011 0100 1110 => 0100101 1010 01110 => 37 10 14
以下類推
欲求的 2019/05/07 表為 39 5 7 => 0100111 0101 00111
=> 0100 1110 1010 0111
=> 0x4EA7 => A7 4E
====
我的思考過程是這樣的:
(1) 首先這兩 byte 數字如果照 Big Endian 表示, 中間的 4Exx 應該對應只差幾天
但實際上相似的反而竟然是月日, 年差很多, 因此考慮 Little Endian 表示
(2) 考慮之後可以看到若依 Little Endian 表示解讀則兩邊都是遞增了
(3) 第二個線索還是 4E 這一塊, 看到尾部只有 10/14 和 2/14 兩組
再加上 0xE = 14, 可以猜測低位可能直接表日數
而月數應該是分開表示而不是連續 (指一月最後一日和次月一日數字不連續)
(4) 考慮到日數可以到 31, 可用 5 個 bit 表示
逐一檢查可以發現這些數字的低 5 bit 正好是日數
(5) 月的部份有一個很明顯的提示: 4E 37 是 10/14, 而 4E 38 是隔年 2/14
(4E 19 和 4E 20 是用十六進位唬你的 XD 因為十六進位 0x19 和 0x20 差 7)
再思考到月可以到 12 之後就可以發現月的 4 bit 是接著剛才的 5 bit 往高位走
(6) 最後剩下的 7 bit, 把它寫出來之後就可以發現到正好是西元年減 1980
這樣就解出這個格式了
====
然後因為這個格式超級眼熟
照印象 google 了一下之後確定沒錯:
它是 FAT16 磁碟格式裡表示檔案建立/修改時間的日期部份的格式
其能表示的日期範圍是 1980/1/1 至 2107/12/31
--
'Oh, Harry, don't you see?' Hermione breathed. 'If she could have done
one thing to make absolutely sure that every single person in this school
will read your interview, it was banning it!'
---'Harry Potter and the order of the phoenix', P513
--
※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 180.177.3.123 (臺灣)
※ 文章網址: https://www.ptt.cc/bbs/Math/M.1572040876.A.E89.html