如何将64位长数据类型转换为16位数据类型

时间:2009-01-28 09:42:20

标签: c++ c timestamp

我想知道如何将64 bit long数据类型转换为任何16 bit数据类型。 以太网应用程序中需要此功能才能包含时间戳。只有 2个字节 16位)才能包含时间戳。但我们将64 bit long作为Win API的时间戳值。因此,从64位数据类型到16位数据类型的转换是必不可少的。

4 个答案:

答案 0 :(得分:5)

好吧,你不能将64位信息放入16位存储而不会丢失一些信息。

因此,您可以自行决定如何量化或截断时间戳。例如。假设您获得的时间戳精确到纳秒级,但您只需要以秒精度存储它。在这种情况下,您将64位数除以1000000000,并留下秒。然后它可能适合16位或不适合16位(16位最多只能存储65535秒)。

如果它不适合,那么你将定期包围时间戳。在您的情况下,这可能是一个问题,也可能不是问题。

在任何情况下,如果您需要连接需要时间戳的现有库 - 在该时间戳中找出它需要什么(时钟滴答?秒?年?)。然后找出你正在使用的Windows时间函数返回的内容。然后将Windows时间单位转换为您使用的时间单位库。

答案 1 :(得分:1)

16位可能或可能不够,具体取决于您需要的时间戳。在大多数情况下,它太小或至少不方便。但是这可能有用的一些例子可能是:超时,测量数据包的往返时间,大量测量时间间隔(这可能对向用户显示时间信息很有效)等等。

另一方面,重新排序数据包可能毫无用处。如果是这种情况,我建议你用序列计数器替换时间戳。根据流中典型的数据包数量,您甚至可以减少几个比特并将其用于其他目的,因为序列计数器可以更轻松地处理包装。

答案 2 :(得分:0)

正如其他人所说,第一个问题是决定正确的缩放。你必须平衡你的分辨率和你想要的最大范围。考虑它的一种方法是决定你想要的每位数秒。每位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);
}

答案 3 :(得分:0)

这完全取决于您使用时间戳的内容。你提到以太网,所以我能想象的一个显而易见的用途是订购数据包。在这种情况下,你真正需要的只是一个柜台。而不是你的时间戳说“这个数据包是在14日下午14:35发送的”,它可以简单地说“这是第4023个数据包”。

如果您需要它来记录实际的时钟时间,您只需选择它的哪些部分是相关的。 16位为您提供65536个值。你想要那些代表秒吗?然后你的时间戳将每18小时回绕一次。

或者他们可以是分钟。然后它们会在它们环绕之前45天。或者天或微秒,这一切都取决于你需要什么。

但是,将64位值转换为16位值的唯一方法是删除48位数据。你选择哪一个