Забудьте о битовых полях и используйте битовые операции для извлечения и кодирования даты. Вот вам go:
#include <time.h>
#include <stdint.h>
/**
tm_sec int seconds after the minute 0-61*
tm_min int minutes after the hour 0-59
tm_hour int hours since midnight 0-23
tm_mday int day of the month 1-31
tm_mon int months since January 0-11
tm_year int years since 1900
*/
struct tm bits_to_date(uint_least32_t i) {
return (struct tm){
.tm_sec = (i >> 0u ) & ((1u << 6u) - 1u),
.tm_min = (i >> 6u ) & ((1u << 6u) - 1u),
.tm_hour = (i >> (6u+6u) ) & ((1u << 5u) - 1u),
.tm_mday = (i >> (6u+6u+5u) ) & ((1u << 5u) - 1u),
.tm_mon = ((i >> (6u+6u+5u+5u) ) & ((1u << 4u) - 1u)) - 1,
.tm_year = (i >> (6u+6u+5u+5u+4u)) & ((1u << 6u) - 1u),
};
}
uint_least32_t date_to_bits(struct tm t) {
return
(uint_least32_t)t.tm_sec |
(uint_least32_t)t.tm_min << 6 |
(uint_least32_t)t.tm_hour << (6u+6u) |
(uint_least32_t)t.tm_mday << (6u+6u+5u) |
((uint_least32_t)t.tm_mon + 1u) << (6u+6u+5u+5u) |
(uint_least32_t)t.tm_year << (6u+6u+5u+5u+4u);
}
#include <assert.h>
#include <string.h>
#include <stdio.h>
int main() {
const struct tm d = {
.tm_sec = 39,
.tm_min = 25,
.tm_hour = 12,
.tm_mday = 28,
.tm_mon = 03,
.tm_year = 14,
};
uint_least32_t v = 0x3938C667;
fprintf(stderr, "%#lX\n", date_to_bits(d));
struct tm r = bits_to_date(v);
fprintf(stderr, "%02d/%02d/%02d %02d:%02d:%02d\n",
r.tm_mday, r.tm_mon+1, r.tm_year,
r.tm_hour, r.tm_min, r.tm_sec
);
assert(date_to_bits(d) == 0x3938C667);
assert(memcmp(&r, &d, sizeof(struct tm)) == 0);
}
Пророги выводят:
0x3938C667
28/04/14 12:25:39