我很尴尬地承认这一点,但我不知道如何阅读。请看图片。虽然我知道有一百万个图书馆可以为我压缩和解压缩文件,但我想学习并了解如何自己做这件事。所以我的问题很简单,如何转换这张图片中的日期。根据文件修改时间。它有0x7d1c
他们如何得到hour 15 minute 40 and second 56
。我绝望地试图理解,但我不明白如何转换。
这取自试图解释 zip 文件格式的站点。
抱歉这个愚蠢的问题,但我只是迷路了。
提前致谢。
时间以 5 位存储,小时以 6 位存储,秒以 5 位存储。
该值0x7d1c
采用0111110100011100
二进制表示。
将其分解为时间分量,您会得到01111
和。101000
11100
01111
的十进制表示为15、40101000
和11100
28。
秒以一半的分辨率存储,即格式只能表示每隔一秒,因此您将秒值乘以 2。
所以时间值是 15:40:56。
使用位运算符。从图中可以看出,时间字段有 16 位,布局如下:
hhhhhmmmmmmsssss
0111110100011100 = 0x7d1c
现在,您想屏蔽掉您感兴趣的位。假设我们想首先获得小时数。我们使用按位与运算符 ( &
) 来屏蔽这些位。AND 运算符有两个操作数。它将使1
两个操作数中的每个位也成为 a1
和所有其他位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 计算器是二进制/十六进制/十进制转换的宝贵工具。