簡體   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