Instead of left shifting with <<
operator (which is more or less equivalent to multiplying by 2^N
), you should rather multiply by 10^N
. Here is how you can do:
int year = bytes[0] * 1000 +
bytes[1] * 100 +
bytes[2] * 10 +
bytes[3];
int month = bytes[4] * 10 +
bytes[5];
int day = bytes[6] * 10 +
bytes[7];
Of course, you can use loops to make your code more readable (if necessary).
enum {
NB_DIGITS_YEAR = 4,
NB_DIGITS_MONTH = 2,
NB_DIGITS_DAY = 2,
DATE_SIZE = NB_DIGITS_YEAR + NB_DIGITS_MONTH + NB_DIGITS_DAY
};
struct Date {
int year, month, day;
};
int getDateElement(char *bytes, int offset, int size) {
int power = 1;
int element = 0;
int i;
for (i = size - 1; i >= 0; i--) {
element += bytes[i + offset] * power;
power *= 10;
}
return element;
}
struct Date getDate(char *bytes) {
struct Date result;
result.year = getDateElement(bytes, 0, NB_DIGITS_YEAR);
result.month = getDateElement(bytes, NB_DIGITS_YEAR, NB_DIGITS_MONTH);
result.day = getDateElement(bytes, NB_DIGITS_YEAR + NB_DIGITS_MONTH, NB_DIGITS_DAY);
return result;
}
With this last code it is easier to change the format of the date stored in bytes
.
Example:
int main(void) {
char bytes[DATE_SIZE] = {2, 0, 1, 3, 0, 8, 1, 9};
struct Date result = getDate(bytes);
printf("%02d/%02d/%04d\n", result.day, result.month, result.year);
return 0;
}
Output:
19/08/2013