Чтение даты 4 байта (старший порядок байтов) из двоичного файла

У меня есть дата, закодированная (с обратным порядком байтов) в 4 байта, которую я пытаюсь прочитать из двоичного файла.

I do:

char date[4];
long seconds;
s = read(fd, date, sizeof(char) * 4);
seconds = (date[3]<<0) | (date[2]<<8) | (date[1]<<16) | (date[0]<<32);

printf("%s\n", ctime(&seconds));

Но я получаю:

Thu Jan  1 00:59:27 1970

Что не так с моим кодом? Спасибо.


person Alex B.    schedule 06.12.2013    source источник
comment
Является ли ваша система Little Endian?   -  person Fiddling Bits    schedule 06.12.2013
comment
OT: sizeof(char) равно 1 по определению.   -  person alk    schedule 07.12.2013


Ответы (2)


(date[0]<<32);

выглядит неправильно. 16 + 8 это 24, а не 32.

person ouah    schedule 06.12.2013
comment
Если date[3] = -128, не становится ли seconds = (date[3]<<0) 0xFFFFFF80? Разве date не должно быть беззнаковым массивом? - person chux - Reinstate Monica; 07.12.2013

Вы можете уменьшить сложность кода, используя ntohl(3):

#include <arpa/inet.h>
/* ... */
uint32_t date;
s = read(fd, &date, sizeof(date));
seconds = ntohl(date);
person user2719058    schedule 06.12.2013
comment
Это путь. - person alk; 07.12.2013