繁体   English   中英

使用python存储和重放二进制网络数据

[英]Storing and replaying binary network data with python

我有一个Python应用程序,它以50 Hz的速率通过网络发送556字节的数据。 使用struct.pack()生成二进制数据,该结构返回一个字符串,该字符串随后被写入UDP套接字。

除了传输此数据外,我还希望将此数据尽可能节省空间地保存到文件中,包括每个消息的时间戳,以便以后可以重播数据。 使用Python做到这一点的最佳方法是什么?

我已经考虑过使用日志记录对象,但是还没有发现Python是否可以读取日志文件,以便我可以重播数据。 另外,我也不知道日志记录对象是否可以处理二进制数据。

任何提示将不胜感激! 尽管可以选择Wireshark,但我宁愿使用应用程序存储数据,以便每次运行程序时都可以自动启动新的数据文件。

Python的日志记录系统旨在处理人类可读的字符串,并易于启用或禁用,具体取决于是您(开发人员)还是其他人运行您的程序。 不要将其用于应用程序始终需要输出的内容。

存储数据的最简单方法是将通过套接字发送的相同的556字节字符串写入文件。 如果要使用时间戳,可以在每个556字节消息之前加上发送时间,将其转换为整数,然后使用struct.pack()打包为4或8个字节。 确切的方法将取决于您的特定要求,例如,您需要时间的精确程度以及是否需要绝对时间还是仅相对于某个参考点。

为了重播目的而使用紧凑时间戳的一种可能性...:将时间设置为自纪元以来以time.time()为单位的秒数的浮点数,乘以50,因为您说的是每秒重复50次(结果单位(五十秒)有时被称为“一个jiffy”),将其截断为int ,从程序开始时所测量的时期开始,从相似的int的jiffies计数中减去,然后将结果进行struct.pack一个无符号整数,其中包含您需要代表预期持续时间的字节数-例如,此时间戳有2个字节,您可以表示大约1200秒(20分钟)的运行时间,但是如果您计划更长的运行时间,则需要4个字节(3个字节太笨拙恕我直言;-)。

并非所有操作系统都具有返回正确精度的time.time() ,因此,如果需要在如此不幸的有限OS上运行,则可能需要更复杂的方法。 (当然,这非常依赖于操作系统)。 您需要支持哪些操作系统?

无论如何...:为了获得更高的紧凑度,请使用略高于50的乘数(例如10000)以提高准确性,并每次存储与前一个时间戳记之间的差值-因为该差值与刻板的差别不大(如果我正确理解了您的规范)应该在这些“万分之一秒”中大约为200左右,并且您可以存储一个无符号字节(并且对您存储的运行持续时间没有限制,以供将来重播) )。 当然,这更取决于time.time()的准确回报。

如果您的556字节二进制数据具有高度可压缩性,那么值得您花点时间使用gzip以压缩形式存储timestamp-then-data流。 不过,最好根据您的实际数据进行经验评估。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM