1

我很尴尬地承认这一点,但我不知道如何阅读。请看图片。虽然我知道有一百万个图书馆可以为我压缩和解压缩文件,但我想学习并了解如何自己做这件事。所以我的问题很简单,如何转换这张图片中的日期。根据文件修改时间。它有0x7d1c他们如何得到hour 15 minute 40 and second 56。我绝望地试图理解,但我不明白如何转换。在此处输入图像描述

取自试图解释 zip 文件格式的站点。

抱歉这个愚蠢的问题,但我只是迷路了。

提前致谢。

4

2 回答 2

4

时间以 5 位存储,小时以 6 位存储,秒以 5 位存储。

该值0x7d1c采用0111110100011100二进制表示。

将其分解为时间分量,您会得到01111和。10100011100

01111的十进制表示为15、401010001110028。

秒以一半的分辨率存储,即格式只能表示每隔一秒,因此您将秒值乘以 2。

所以时间值是 15:40:56。

于 2013-01-19T20:58:51.437 回答
2

使用位运算符。从图中可以看出,时间字段有 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 计算器是二进制/十六进制/十进制转换的宝贵工具。

于 2013-01-19T21:11:01.493 回答