Как конвертировать 64-битный тип данных в 16-битный тип данных - PullRequest
0 голосов
/ 28 января 2009

Я хотел бы знать, как преобразовать 64 bit long Тип данных в любой из 16 bit Типов данных. Эта функция требуется в приложении Ethernet для включения отметки времени . Только 2 байта ( 16 бит ) доступны для включения отметки времени . Но мы получаем 64 bit long как метку времени от Win API. Таким образом, преобразование из 64-битного типа данных в 16-битный тип данных является необходимым.

Ответы [ 4 ]

5 голосов
/ 28 января 2009

Ну, вы не можете разместить 64 бита информации в 16-битном хранилище, не потеряв часть информации.

Так что вам решать, как квантовать или урезать временную метку. Например. Предположим, вы получаете метку времени с точностью до наносекунды, но вам нужно только сохранить ее с точностью до секунды. В этом случае вы делите 64-битное число на 1000000000 и оставляете секунды. Тогда он может уместиться в 16 бит или нет (16 бит будут хранить только до 65535 секунд).

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

В любом случае, если вам нужно подключить существующую библиотеку, требующую метки времени - выясните, что нужно в этой метке времени (часы тикают? Секунды? Годы?). Затем выясните, какую функцию Windows Times вы используете. Затем преобразуйте единицу времени Windows в единицу времени библиотеки, которую вы используете.

1 голос
/ 28 января 2009

16 битов может быть или не быть достаточно, в зависимости от того, для чего вам нужна временная метка. Для большинства целей это слишком мало или, по крайней мере, неудобно. Но некоторые примеры, где это может сработать, могут быть: тайм-ауты, измерение времени прохождения сигнала в обоих направлениях, грубое измерение временных интервалов (которые могут нормально работать для отображения информации о времени пользователям) и т. Д.

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

0 голосов
/ 28 января 2009

Это полностью зависит от того, для чего вы используете временную метку. Вы упомянули Ethernet, поэтому одно очевидное использование, которое я могу себе представить, - это заказ пакетов. И в этом случае все, что вам действительно нужно, это счетчик. Вместо вашей отметки времени о том, что «этот пакет был отправлен 14 мая в 14:35», он может просто сказать «это 4023-й пакет».

Если вам нужно записать фактическое время на часах, вам просто нужно выбрать, какие его части актуальны. 16 битов дают 65536 значений для игры. Вы хотите, чтобы те представляли секунды? Тогда ваши временные метки будут меняться каждые 18 часов.

Или они могут быть минутами. Тогда пройдет 45 дней, прежде чем они обернутся. Или дни, или микросекунды, все зависит от того, что вам нужно.

Но единственный способ преобразовать 64-битное значение в 16-битное - это удалить 48 бит данных. Вы выбираете, какие из них

0 голосов
/ 28 января 2009

Как уже говорили другие, первая проблема заключается в выборе правильного масштабирования. Вы должны сбалансировать свое разрешение с желаемым максимальным диапазоном. Один из способов думать об этом - решить, сколько секунд на бит вы хотите. С 1 секундой на бит вы можете выразить значения от 1 секунды до 65536 секунд или ~ 1000 минут. 1 миллисекунда на бит позволяет перейти от 0,001 секунды до 65,5 секунды

Вот один из способов сделать преобразование.

#define seconds_per_bit   .0001  <--YOUR VALUE HERE.
#define bits_per_second   (1/seconds_per_bit);  
int16 timestamp()
{
  Int64 counts_per_second,counts;

  QueryPerformanceFrequency(&counts_per_sec);
  QueryPerformanceCounter(&counts);  
  return (UInt16)(counts * bits_per_second / counts_per_second);
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...