2016-11-09 2 views
2

У меня есть код, который записывал данные с устройства и был привязан к данным с системным временем в миллисекундах.Magically Undo fprintf format Ошибка

Я использовал uint64_t хранить метку времени, которая была создана, как это:

 

struct timespec request; 
clock_gettime(CLOCK_REALTIME, &request); 
uint64_t stamp0 = (uint64_t)((uint64_t)request.tv_sec * 1000 + (uint64_t)request.tv_nsec/1000000); 
 

Тогда я написал метку времени в файл (не думая, через), как это:

 

fprintf(ptr,"%ld\n",(long)stamp0); 
 

Теперь у меня есть неправильные метки времени в моих файлах, которые выглядят как 1130802699, но должны выглядеть как 1478599582064.

Есть ли что-нибудь, что я могу сделать, чтобы исправить мою ошибку?

ответ

5

Я предполагаю, что отметка времени 1130802699 должна быть больше похожа на 1478599552523, чем 1478599582064.

Если да, то вы можете быть в состоянии восстановить метки времени путем добавления соответствующего кратна 1 < < 32 (Я предполагаю, что ваш long 32 бита, а усеченные значения не перевернуться в отрицательном диапазоне). В этом случае это 344 раза, или 1477468749824, чтобы добавить к каждому значению.

Ваши 32-битные значения будут переворачиваться каждые 6 недель или около того, поэтому вам, возможно, придется сделать что-то немного умнее, если ваши файлы занимают более длинный диапазон.


Если вам интересно, как я придумал это значение, мы должны работать в обратном направлении.

Мы знаем, что мы усечены uint64_t до (примерно) int32_t, и если мы делаем некоторые разумные предположения (например, 2 дополнение арифметическое), это означает, что маскирование с 0xffffffff:

stamp0 & 0xffffffff 

Это эквивалентно вычитанию

stamp0 - (stamp0 & 0xffffffff00000000) 

Это различие будет постоянным по большому диапазону значений и приблизительно равно разнице между фактическим и ожидаемым значениями.

1478599582064 - 1130802699 - 1477468779365, или 0x15800007365.

Так что я думаю, что смещение, чтобы добавить обратно на самом деле 0x15800000000.

+0

Спасибо, отметки времени не были точными совпадениями, поэтому я подозреваю, что вы правы. К счастью, это было только через час или около того, поэтому переключение не должно быть проблемой. Не могли бы вы объяснить мне, как вы пришли к значению '344', пожалуйста? – James

+0

Спасибо, это действительно помогает, вы избавили меня от боли. – James

Смежные вопросы