我有一个二进制文件,其中保存了来自数据记录器的数据。
我有一个非常神秘的手册,可以帮助用户解码二进制文件,它给出了一个例子:日期“ 28/04/14 12:25:39”以32位编码:0x3938C667
[首先,我将此十六进制字符串输入到十六进制至十进制转换器和十六进制至Ascii转换器中,希望它能将其解码为接近日期的内容。十六进制字符串甚至没有足够的位数来等于日期的位数?
额外信息:
这里还有一些手册上的代码,没有给我太多信息...
日期/时间存储在4个字节上,结构为:
typedef union
{
unsigned long val;
struct
{
unsigned char seconds :6; // 00 - 59
unsigned char minutes :6; // 00 - 59
unsigned char hours :5; // 00 - 23
unsigned char days :5; // 01 - 31
unsigned char months :4; // 01 - 12
unsigned char years :6; // 00 - 63
};
}compact_date_t;
位域几乎为您提供了所有这些。六个低位数秒。让我们取6个低位-会是
0x3938C667 & 0x3F = 0x27 = 39
** 0x3F
是0000111111
的二进制表示-屏蔽除低6位以外的所有内容。
接下来的分钟-接下来的6位:
(0x3938C667 >> 6) & 0x3F = 0x19 = 25
...其余的您可以自己解决]
手册中的代码为您提供所需的确切信息。它告诉您前6位用于“秒”,后6位用于“分钟”,等等。它告诉您日期的确切格式为二进制。
如果将所有位加起来,将得到32位,即4个字节。
重要的是要知道这是“从右到左”。换句话说,最低有效位是“秒”,最高有效位是“年”。