2009-12-01 27 views
0

我們有一個應用程序,我們需要將一個數據流中的某些數據反序列化爲多個對象。如何在C#中通過多個調用遍歷數組

Data數組表示一些可變長度的消息打包在一起。流中沒有消息分隔代碼。

我們想要做的事,如:

void Decode(byte[] Data) 
{ 
    Object0.ExtractMessage(Data); 
    Object1.ExtractMessage(Data); 
    Object2.ExtractMessage(Data); 
    ... 
} 

每個過程數據調用知道在哪裏可以在陣列中啓動。理想情況下,我們會在不通過DataIx引用的情況下執行此操作。

要在C++中執行此操作,我們只需將指針移交到數組中,並且每個ProcessData函數都會根據需要增加它。

每個對象類都知道自己的消息是如何序列化的,並且可以依賴於(在C++中)在流中下一條消息的開始處返回指針。

是否有一些內置的機制,我們可以用來做到這一點(不去unsafe)?操作頻率很高(〜10kps),非常輕便。我們也不想去複製或修剪陣列。

感謝您的幫助。

+1

我知道你說你不想使用索引,但我過去如何做到這一點是傳入一個開始索引並返回下一個索引以繼續。 – 2009-12-01 01:19:14

+0

我可以,如果沒有其他辦法,我會這樣做,這也是我們過去的做法。只是想知道是否有一個更好的方法? – 2009-12-01 01:20:33

回答

2

難道你不只是傳入並返回數組索引?無論如何,這基本上就是一個指針,它是一個固定內存位置的偏移量。

0

如何將數據包裝到MemoryStream中,然後將StreamReader傳遞到ExtractMessage方法?

0

我猜想幾件事情。

您可以通過將byte []包裝到同樣維護數組偏移量的類中來模擬指針的動作。無論何時訪問數組,您都可以通過訪問方法來訪問它,該訪問方法返回下一個字節並增加偏移量變量。類實例可以在不同的ExtractMessage函數調用之間傳遞。

如何使用C++/CLI?這將允許您使用熟悉的C/C++技術,但可以直接從C#中調用,而不需要可怕的互操作。

那麼當然有一個可怕的不安全選項,從而獲得一個指向byte []的C#指針並執行所需的指針運算。

2

好吧,這聽起來像你想要一個簡單的流(例如,只需使用MemoryStream作爲你的字節數組的包裝:stream = new MemoryStream (data)).只需將字節數組包裝到流中,每個對象從流中讀取儘可能多的數據,而不是一次性加載整個字節數組的好處

除此之外,您可以在C#中使用與C++中完全一樣的指針(雖然指針需要不安全的關鍵字,但他們不鼓勵)

或者,您可以傳遞數據和索引變量,然後增加索引(實際上,t他和使用指針一樣,但不需要不安全)。

+0

我喜歡Stream的想法 - 目標是保持消息傳遞系統的C和C#部分的外觀和工作儘可能相似。 – 2009-12-01 01:28:51

+0

對於某些組件...... :) – 2009-12-01 01:29:38

0

您可以從字節數組中創建一個stream

Stream stream = new MemoryStream(data); 

然後你的處理器可以在流上工作。