2012-03-25 42 views
0

我正在編寫一個程序,使用無連接(UDP)套接字與某個患者監視器進行通信。我需要一個建議,用於解析從患者監護儀接收到的數據的最快和最有效的算法。用C編寫套接字並反序列化響應

病人監視器發送數據作爲的AttributeList結構,該結構的定義是以下: -

typedef struct { 
    uint16 count; 
    uint16 length; 
    AVAType * values; 
} AttributeList; 

typdef struct { 
    uint16 id; 
    uint16 length; 
    void * data; 
} AVAType 

因此,一個AttributeList中包含許多AVAType結構,並且每AVAType結構包含ID和作爲void指針數據(數據是隻是AVAType中實際數據的佔位符)。實際上,爲AVAType和每個ID定義了大約150個ID,爲了解析目的,數據必須放置在相應的數據結構中。

因此,如果在ID結構AVAType爲1,則數據必須使用算法的一個解析,但如果ID是2,那麼數據必須使用算法B等進行解析...

我的當前方法是使用150 if-else語句並加載AVAType的特定數據結構,然後解析結果。患者監護儀也按網絡順序發送數據,我需要根據ID解包AVAType。

請提出一些處理這種情況的好方法。這僅僅是一件大學的事情,我對安全性並沒有太多的關注,我認爲安全性可以逐漸提高,但現在我的速度正在加快。

是的,它是actaully AVAType values [] ;.你能更具體地說明爲什麼這與AVAType *有所不同?如果我用其他方式定義我的結構,它可以有用嗎?

+0

也許你可以創建一個hashmap,其中key是ID,value是一個函數指針。這樣你不需要if-else結構,但可以從哈希表中獲取算法的函數。編輯:如gbulmer所說,函數指針數組更合理。 – Timo 2012-03-25 20:54:06

+0

在處理患者監護儀時,您是否應該將注意力放在可靠性和安全性上而不是速度上? – 2012-03-25 21:00:30

+0

除非您正在使用內存有限的嵌入式系統,否則我建議使用數組。調試很簡單,非常可預測。該ID只有16位,這是相當小的存儲量。它在運行時非常可預測,它是'fun_ptr [id](...)'。因爲它非常簡單,它也應該直接添加功能來自動測試它們,並看到數據和調用匹配。 – gbulmer 2012-03-25 21:01:50

回答

8

通常的方法從整數到功能映射僅僅是一個函數指針陣列

typedef void (*Fun_ptr)(int id, void *current_byte); 

Fun_ptr fun_ptr[0xFFFF+1] = { funcA, funcB, ...}; 

如果ID只有一個字節,身份證映射所有256(如果它可以被限制)。

即使所有的16位ID都不是很多的存儲空間。

我將未使用的id指向'錯誤捕獲'函數。

用途:

next_buffer_position = fun_ptr[id](id, current_buffer_position); 

然後函數知道哪個ID有人呼籲,使error_catch功能容易寫,你只需要一個。


你確定這是AVAType * values;void * data;
values還是data應該是數據包內的偏移?
這並非不可能,而且可能是正確的。目前AVAType和AttributeList是固定的大小。

字段AVAType * values;void * data;是指針的接收計算機大小。這可能是任何事情,但可能是32位或64位。如果將軟件移動到不同的機器上,這是一個潛在的問題,這也是我問的原因。它們不包含數據,它們指向數據,但它們的大小取決於接收機器。 Suspicous。仔細檢查他們被定義爲什麼大小。

在網絡協議上處理數據包的常用方法是將空數組作爲結構中的最後一個字段,例如,

typdef struct { 
    uint16 id; 
    uint16 length; 
    unsigned char data[]; 
} AVAType; 

在該方法中,通常在信息包的起始附近的固定位置的數據包長度,並且,使該數據包的剩餘部分的實際尺寸。所以協議定義了整個數據包還是data[]是長度字節。這有點'hackish',但它很容易使用。 (NB IIRC unsigned char data[];不是合法的C++)

摘要:很可能內存中的結構就是您已經顯示的類型定義,但在線協議有點奇怪,因爲可變大小的一個指針。

+0

嗨,感謝您的快速回復。你能告訴我AVAType []和AVAType *有什麼不同?如果我以這種方式定義結構,它可能有用嗎? – Shivam 2012-03-25 21:21:39