您需要的是一些按位运算。首先,用字节构造一个 int:
int n = b[0] | (b[1] << 8) | (b[2] << 16) | (b[3] << 24);
然后,将 int 分成组件。现在,您的问题没有指定字段的走向,从右到左还是从左到右。这个问题与字节序有关,但不完全相同。因此,我们假设字段从左到右。
良好的判断力建议从左到右。这样,可以比较时间值的整数表示 - 年位的重要性大于月份位等,因此当您比较对应于两个时间时刻的整数时,您会得到按时间顺序排列的正确结果。
这是给你的一个心理形象。这是一个整数变量,由位组成:
f e d c b a 9 8 7 6 5 4 3 2 1 0
-----
offset is 6, length is 3
让我们定义一个函数,它以给定的偏移量(以位为单位)从 int 中获取任意块,并具有给定的长度(以位为单位)。
int bits(int n, int offset, int length)
{
//shift the bits rightward, so that the desired chunk is at the right end
n = n >> (31 - offset - length);
//prepare a mask where only the rightmost `length` bits are 1's
int mask = ~(-1 << length);
//zero out all bits but the right chunk
return n & mask;
}
可能只是一句俏皮话,但我想让它具有一定的启发性。下面的答案中的人们通过为每个块手动指定移位因子和掩码来有效地内联此函数。
现在我们来分解一下。假设 n 来自最上面的片段:
int year = bits(n, 0, 6),
month = bits(n, 6, 4),
day = bits(n, 10, 5),
hour = bits(n, 15, 5),
min = bits(n, 20, 6),
sec = bits(n, 26, 6);
我们通过将前面字段的总长度组合在一起来获得偏移量的值。这是在字段从左到右的假设下进行的;如果相反,偏移值将会不同。
这有道理吗?
编辑:如果位块从右到左,那么它是这样的:
int sec = bits(n, 0, 6),
min = bits(n, 6, 6),
hour = bits(n, 12, 5),
day = bits(n, 17, 5),
month = bits(n, 22, 4),
year = bits(n, 26, 6);