如何读取这个二进制转换为整数?

时间:2013-01-19 20:51:36

标签: c# binary zip

我很尴尬承认这一点,但我不知道怎么读这个。请看图像。虽然我知道有一百万个库可以为我拉链和解压缩文件,但我想学习并了解如何自己完成这个。所以我的问题很简单,我如何转换此图像中的日期。在文件修改时间。它有0x7d1c他们如何获得hour 15 minute 40 and second 56。我绝望地试图理解,但我不明白如何转换。 enter image description here

这是从试图解释zip文件格式的this网站获取的。

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

提前致谢。

2 个答案:

答案 0 :(得分:4)

时间存储时间为五位,分钟为六位,秒数为五位。

0x7d1c在二进制表示中为0111110100011100

在时间组件中拆分,您得到0111110100011100

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计算器是二进制/十六进制/十进制转换的宝贵工具。