1

これを認めるのは恥ずかしいのですが、どうやって読むのかわかりません。画像をご覧ください。ファイルを圧縮および解凍するライブラリが100万あることは知っていますが、これを自分で行う方法を学び、理解したいと思います。だから私の質問は簡単ですこの画像の日付を変換するにはどうすればよいですか?ファイル変更時間の下。それは彼らが0x7d1cどのように得るかを持っていますhour 15 minute 40 and second 56。私はどうしようもなく理解しようとしていますが、変換する方法がわかりません。ここに画像の説明を入力してください

これは、zipファイル形式を説明しようとしているこのサイトから取得したものです。

ばかげた質問で申し訳ありませんが、私は途方に暮れています。

前もって感謝します。

4

2 に答える 2

4

時刻は、時が 5 ビット、分が 6 ビット、秒が 5 ビットで格納されます。

0x7d1c0111110100011100バイナリ表現です。

それを時間コンポーネントに分割すると01111101000とが得られます11100

01111の 10 進数表現は15、40 101000、および1110028 です。

秒は半分の解像度で保存されます。つまり、この形式では 1 秒おきにしか表現できないため、秒の値に 2 を掛けます。

したがって、時刻の値は 15:40:56 です。

于 2013-01-19T20:58:51.437 に答える
2

Use bitwise operators. From the picture it follows that the time field has sixteen bits with the following layout:

hhhhhmmmmmmsssss
0111110100011100 = 0x7d1c

Now, you want to mask out the bits that you are interested in. Let's say we want to get the number of hours first. We use the bitwise AND-operator (&) to mask out these bits. The AND-operator takes two operands. It will make each bit that is 1 in both operands also a 1, and all others 0.

hhhhhmmmmmmsssss
0111110100011100 = 0x7d1c
1111100000000000 = 0xf800
----------------
0111100000000000 = 0x7d1c & 0xf800 = 0x7800

Now you have only the bits of interest, the 'hour' bits. However, the zeroes to the right are not meaningful to us, so we use the right shift operator (>>) to move the bits into the right place, 11 places to the right.

0111100000000000 = 0x7d1c & 0xf800 = 0x7800
0000000000001111 = (0x7d1c & 0xf800) >> 11 = 0xF = 15

This is your result; 15 hours. The general rule in this case is this:

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).

I'll leave it to you to verify the last two lines. Note that the windows calculator on 'programmer mode' is an invaluable tool for binary / hex / decimal conversions.

于 2013-01-19T21:11:01.493 に答える