如何在C#中通过多个调用遍历数组

问题描述:

我们有一个应用程序,我们需要将一个数据流中的某些数据反序列化为多个对象。如何在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

难道你不只是传入并返回数组索引?无论如何,这基本上就是一个指针,它是一个固定内存位置的偏移量。

如何将数据包装到MemoryStream中,然后将StreamReader传递到ExtractMessage方法?

我猜想几件事情。

您可以通过将byte []包装到同样维护数组偏移量的类中来模拟指针的动作。无论何时访问数组,您都可以通过访问方法来访问它,该访问方法返回下一个字节并增加偏移量变量。类实例可以在不同的ExtractMessage函数调用之间传递。

如何使用C++/CLI?这将允许您使用熟悉的C/C++技术,但可以直接从C#中调用,而不需要可怕的互操作。

那么当然有一个可怕的不安全选项,从而获得一个指向byte []的C#指针并执行所需的指针运算。

好吧,这听起来像你想要一个简单的流(例如,只需使用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

您可以从字节数组中创建一个stream

Stream stream = new MemoryStream(data); 

然后你的处理器可以在流上工作。