我很尴尬承认这一点,但我不知道怎么读这个。请看图像。虽然我知道有一百万个库可以为我拉链和解压缩文件,但我想学习并了解如何自己完成这个。所以我的问题很简单,我如何转换此图像中的日期。在文件修改时间。它有0x7d1c
他们如何获得hour 15 minute 40 and second 56
。我绝望地试图理解,但我不明白如何转换。
这是从试图解释zip文件格式的this网站获取的。
抱歉这个愚蠢的问题,但我只是迷路了。
提前致谢。
答案 0 :(得分:4)
时间存储时间为五位,分钟为六位,秒数为五位。
值0x7d1c
在二进制表示中为0111110100011100
。
在时间组件中拆分,您得到01111
,101000
和11100
。
01111
的十进制重新定位为15,101000
为40,11100
为28。
以秒的分辨率存储秒数,即格式只能表示每隔一秒,因此您将秒值乘以2。
所以时间价值是15:40:56。
答案 1 :(得分:2)
使用bitwise operators。从图中可以看出,时间字段有16位,具有以下布局:
hhhhhmmmmmmsssss
0111110100011100 = 0x7d1c
现在,你想要掩盖你感兴趣的位。让我们说我们想先得到小时数。我们使用按位AND运算符(&
)来掩盖这些位。 AND运算符需要两个操作数。它会使两个操作数中1
的每个位都为1
,其他所有位0
。
hhhhhmmmmmmsssss
0111110100011100 = 0x7d1c
1111100000000000 = 0xf800
----------------
0111100000000000 = 0x7d1c & 0xf800 = 0x7800
现在你只有感兴趣的位,即'小时'位。但是,右边的零对我们没有意义,所以我们使用右移位运算符(>>
)将位移到正确的位置,向右移动11个位置。
0111100000000000 = 0x7d1c & 0xf800 = 0x7800
0000000000001111 = (0x7d1c & 0xf800) >> 11 = 0xF = 15
这是你的结果; 15个小时。在这种情况下的一般规则是:
hours = (value & 0xf800) >> 11;
minutes = (value & 0x7e0) >> 5;
seconds = (value & 0x1f) * 2; // the number of seconds is rounded to an even number
// to save a bit, so multiply by two (see picture).
我会留给你验证最后两行。请注意,'程序员模式'上的Windows计算器是二进制/十六进制/十进制转换的宝贵工具。