Хранение метки времени в виде двоичной дроби в C - PullRequest
3 голосов
/ 30 октября 2019

Я работаю над реализацией неясного сетевого протокола, и одно из требований заключается в том, что каждый заголовок пакета должен содержать 56-битную метку времени, причем первые 4 байта содержат целое число секунд с начала эпохи, иоставшиеся 3 байта содержат двоичную дробь текущей секунды. Другими словами, последние 3 байта должны представлять количество 2 ^ -24 секунд с предыдущей секунды. Первая часть временной метки тривиальна, но я изо всех сил пытаюсь реализовать код C, который будет хранить дробную часть временной метки. Кто-нибудь может пролить некоторый свет на то, как это сделать?

Для полноты, вот код временной метки, который у меня есть. primaryHeader - это char*, который я использую для хранения данных заголовка пакета. Можно предположить, что первые 6 байтов в primaryHeader содержат действительные, не связанные данные, и что primaryHeader достаточно велик, чтобы в нем содержалось все, что необходимо сохранить.

int secs = (int)time(NULL);
memcpy(&primaryHeader[7], &secs, sizeof(int));
// TODO: Compute fractional portion of the timestamp and memcpy to primaryHeader[11]

1 Ответ

4 голосов
/ 30 октября 2019

Функция time() даст вам только секунды. Вы используете таймер с более высоким разрешением.

struct timespec t;
timespec_get(&ts, TIME_UTC);
int secs = t.tv_sec; // Whole seconds
int frac = ((int64_t)t.tv_nsec << 24) / 1000000000; // Fractional part.

Если он недоступен, вы можете использовать clock_gettime, но clock_gettime не найден в Windows.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...