我想知道如何将64 bit long
数据类型转换为任何16 bit
数据类型。 以太网应用程序中需要此功能才能包含时间戳。只有 2个字节( 16位)才能包含时间戳。但我们将64 bit long
作为Win API
的时间戳值。因此,从64位数据类型到16位数据类型的转换是必不可少的。
答案 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位数据。你选择哪一个