2011-12-27 80 views
1

我有一個消息的自定義二進制協議和二進制規範。二進制協議爲每條消息添加一些標題。該消息相對較大,包含近50個不同的字段。我的要求是在linux 2.6.x上用c或C++中的gcc編譯器僅解析二進制消息中的2個字段。解析C中的二進制數據

一位開發人員創建了一個表示標題的類,另一個表示該消息的C++類。收到消息後,他只是在字節有效載荷上使用static_cast來取回消息類。一旦他獲得了消息對象類,他只需使用pointerToMessage.getFieldName()來獲取數據。

上段的更正。開發人員創建了一個結構,而不是該消息的類。該結構使用gcc的__attribute __((__ packed__))。

我的問題是,將使用static_cast結果在整個消息得到解析或解析發生在訪問時間,例如,在pointerToStruct.fieldName?另外,他定時進行了2次操作,發現幾乎沒有時間做static_cast,在這裏大約需要120微妙的時間通過pointerToStruct.fieldName來訪問字段。爲什麼要進入一個領域需要很長時間?

+1

爲什麼static_cast會執行解析? – Pubby 2011-12-27 22:01:56

+0

我很抱歉,因爲我不是C++開發人員,而且編碼人員不可用。因此,上面的問題。那麼,解析是在訪問時發生的嗎? – Jimm 2011-12-27 22:06:56

+1

@Jimm:到目前爲止您所描述的任何內容都涉及解析。 – ildjarn 2011-12-27 22:07:41

回答

2

我的問題是,將使用整個消息的static_cast結果得到解析

號的唯一的static_cast告訴存儲器內容通過被投的指針指向的編譯器應該被看作它包含您輸入的格式的數據。如果數據不是這種格式,那麼您很可能會被垃圾弄掉。

如果您100%確定傳入緩衝區包含正在投射類型的正確數據,則這是訪問數據的有效方式。但是既然你談論消息和協議,我會仔細檢查一下,在系統通信中不會妨礙端到端,對齊,填充和詞組化等事情。

此外,他定時執行了2個操作,發現它幾乎沒有時間去做static_cast,在這裏大約需要120微妙的時間通過pointerToMessage.getFieldName()訪問字段。爲什麼要進入一個領域需要很長時間?

可能是因爲tha cast realy沒有做太多的事情,本質上它只是創建一個指定類型的指針給你給它的內存地址。當您嘗試閱讀郵件的內容時,會發生真正的訪問。