我有 16 位可供使用。其中,4 位為標頭,不可觸碰。這給我們留下了 12 位。我想將日期和時間資料編碼到它們中。這些本質上是通過LPWAN發送的日志。
顯然,不可能將適當的通用日期和時間編碼到其中。由于 unix 時間戳使用 32 位,而Compact Time Format等專案使用 5 個位元組。
假設我們真的不需要年份,因為這些資訊可以在其他地方獲得。假設秒的時間解析度不必非常精確,因此我們可以將秒分成 30 秒的間隔。如果我們要簡單地對資料進行編碼,那么:
4 bits month (0-11)
5 bits day (0-31)
5 bits hour (0-23)
6 bits minute (0-59)
1 bit second (0,30)
-----------------------------
21 bits
21 位比 32 位要好得多。但它仍然不是 12 位。我可以從分鐘中減去一位(四舍五入到最接近的偶數分鐘),然后洗掉秒,但仍然剩下 19 位。距離 12 點還很遠。
只是想知道這是否可能,以及是否有人有任何想法。
uj5u.com熱心網友回復:
12 位可以保存2^12 = 4096值,這對于一項任務來說感覺非常緊張。不確定在將日期時間壓縮為 4096 數字方面可以做很多事情。表示這些資料的空間太小。
有一些解決方法,它們都不能實作你想要的,但也許你可以使用一些東西:
拆分日期和時間。在發送日期/時間之間交替使用某種演算法,一位可用于指示正??在發送的資料。這留下了 11 位來編碼日期或時間。你可以走得更遠一點,也可以像這樣分開時間。接收方然后可以重建一個完整的日期時間,可以訪問先前接收到的資料。
您可以有一個模式,其中一個日期資料包作為起點發送,隨后的資料包從紀元開始以 N 秒的間隔遞增
從資料中完全洗掉日期時間,節省 12 位,但將其作為獨立的心跳/日期時間資料包定期發送。
您可以嘗試壓縮整個資料包,這可以允許使用更多位來表示日期時間,并且仍然適合較小的整體資料包大小
如果資料以合理的固定間隔發送,您可以使用 的回圈計數器
an interval of N seconds,如果您的設備很少,這可能會起作用,并且您可以跟蹤它們何時開始傳輸。例如,一顆衛星在 XYZ 日期時間發射,它每 30 秒發送一次計數器,我們收到計數器值100,計算日期我們使用簡單的數學XYZ 30*100 seconds
uj5u.com熱心網友回復:
不,除非您對代表不到一天半的時間感到滿意。你可以數一下 4096 個 30 秒的時間間隔,你會發現這將涵蓋 34 小時 8 分鐘。4096 兩分鐘間隔只是四倍,即五天 16 小時 32 分鐘。還是一年的一小部分。
如果您可以確保連續日志條目之間的差異很小,那么您可以將其填充為 12 位。您將需要一個特殊條目來給出初始日期,并且當連續條目之間的差異太大時,也許您可??以插入這樣一個條目。
@oleksii 還有一些其他好的建議。
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/512088.html
