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

时间:2010-08-02 00:37:25

标签: python serialization binary-data

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

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

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

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

2 个答案:

答案 0 :(得分:4)

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

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

答案 1 :(得分:1)

用于重放目的的紧凑时间戳的一种可能性...:将时间设置为自time.time()的纪元以来的浮点数秒,再乘以50,因为您说您重复这50次a第二个(得到的单位,一个五十分之一秒,有时被称为“jiffy”),截断到int,从你在开始时测量的纪元以来的相似int个jiffies中减去你的程序,struct.pack结果到一个unsigned int,你需要表示预期持续时间的字节数 - 例如,对于这个时间戳有2个字节,你可以表示大约1200秒的运行(20分钟),但如果你计划更长的运行,你需要4个字节(3个字节是太笨拙恕我直言; - )。

并非所有操作系统都有time.time()返回相当不错的精度,因此如果您需要运行此类不幸的有限操作系统,您可能需要更多不正常的方法。 (当然,那是非常依赖的)。你需要支持哪些操作系统......?

无论如何......:为了更加紧凑,使用略高于50(比如10000)的乘数来获得更高的准确度,并且每次都存储与之前时间戳不同的差异 - 因为这种差异应该没有太大差异从一个jiffy(如果我理解你的规范正确)应该是这些“十万分之一秒”的大约200左右,你可以存储一个无符号字节(并且没有限制你运行的运行持续时间为了将来的重播)。这当然取决于time.time()的准确回报。

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