0

我需要想出一种方法将日期解压缩为可读格式。不幸的是,我并不完全理解所使用的原始流程/代码。

根据转发给我的信息,日期是使用自定义 C/Python 代码打包的,如下所示;

  date = year << 20;
  date |= month << 16;
  date |= day << 11;
  date |= hour << 6;
  date |= minute;

例如,最近的打包日期是 2107224749,相当于 2009 年 9 月 22 日星期二上午 10:45

我明白....或者至少我很确定.... << 正在移动位,但我不确定“|”是什么 完成。

此外,为了解压代码,注释如下:

year = (date & 0xfff00000) >> 20;
month = (date & 0x000f0000) >> 16;
day = (date & 0x0000f800) >> 11;
hour = (date & 0x000007c0) >> 6;
minute = (date & 0x0000003f);

最终,我需要做的是使用 JavaScript 或 ASP 执行解包并转换为可读格式,但我需要更好地理解上述过程才能开发解决方案。

任何帮助、提示、提示、指针、想法等将不胜感激。

4

6 回答 6

3

管道 ( |) 是按位或,用于将位组合成单个值。

提取看起来很简单,但我建议先移动,然后再进行掩蔽。这使用于掩码的常数尽可能小,这更易于管理(并且可能更有效,尽管对于这种情况几乎不重要)。

查看以二进制形式编写的掩码可以揭示每个字段使用了多少位:

  • 0xfff00000 设置了 12 位,所以 12 位用于年份
  • 0x000f0000 设置了 4 位,用于月份
  • 0x0000f800 设置了 5 位,用于当天
  • 0x000007c0 设置了 5 位,用于小时
  • 0x0000003f 设置了 6 位,一分钟
于 2009-09-23T13:06:50.327 回答
2

这个想法正是你所说的。执行“<<”只是将位向左移动。什么| (按位或)完成基本上是向数字添加更多位,但不会覆盖已经存在的内容。

证明这一原则可能会有所帮助。

假设我们有一个字节(8 位),并且我们有两个数字,每个数字都是 4 位,我们希望将它们“放在一起”以形成一个字节。假设数字是二进制的 1010 和 1011。所以我们希望得到字节:10101011。

现在,我们如何做到这一点?假设我们有一个字节 b,它被初始化为 0。

如果我们取第一个要添加的数字 1010,并将其移动 4 位,我们得到数字 10100000(移位将字节添加到数字的右侧)。

如果我们这样做:b = (1010 << 4),b 的值将是 10100000。

但是现在,我们要添加另外 4 个位(0011),而不触及前面的位。为此,我们可以使用|。这是因为 | 运算符“忽略”我们数字中为零的任何内容。所以当我们这样做时:

10100000 (b's current value)
|
00001011 (the number we want to add)
We get:
10101011 (the first four numbers are copied from the first number, 
          the other four numbers copied from the second number).

注意:这个答案出来的有点长,我在维基上,所以,如果这里的任何人有更好的解释如何解释它,我会很感激你的帮助。

于 2009-09-23T13:23:34.280 回答
0

这些链接可能会有所帮助:

http://www.gamedev.net/reference/articles/article1563.asp

http://compsci.ca/v3/viewtopic.php?t=9893

于 2009-09-23T13:18:50.683 回答
0

只是添加一些实用技巧:

minute = value & ((1 << 6)-1);
hour = (value >> 6) & ((1<<5)-1);  // 5 == 11-6 == bits reserved for hour
...

1 << 5在位置 5 创建一个位(即 32=00100000b),
(1<<5)-1创建一个位掩码,其中设置了 5 个最低位(即 31 == 00011111b)

x & ((1<<5)-1)执行按位“和”仅保留最低五位中设置的位,提取原始小时值。

于 2009-09-23T14:18:22.313 回答
0

是的 << 移位位和 | 是按位或运算符。

于 2009-09-23T13:08:33.230 回答
0

在解码部分 & 是按位的, 0xfff00000 是十六进制位掩码。基本上,位掩码中的每个字符代表数字的 4 位。0 是二进制的 0000 和 f 是 1111 所以如果你看一下二进制的操作,你是和 1111 1111 1111 0000 0000 ... 与日期的任何东西,所以基本上你得到前三个半字节(半字节)并移动它们向下,以便 00A00000 为您提供当年的 10(十六进制的 A)。

另请注意, |= 就像 += 一样,它是按位计算的,或者然后将赋值合并为一个。

于 2009-09-23T13:26:12.917 回答