如何在多个调用的C#中迭代数组

时间:2009-12-01 01:15:15

标签: c# .net c#-4.0

我们有一个应用程序,我们需要将一些数据中的某些数据反序列化为多个对象。

Data数组表示许多可变长度的消息打包在一起。流中没有消息分隔代码。

我们想做类似的事情:

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

其中每个ProcessData调用都知道在数组中从哪里开始。理想情况下,我们会在不传递DataIx引用的情况下执行此操作。

要在C ++中执行此操作,我们只需将指针移到数组中,每个ProcessData函数都会根据需要递增它。

每个对象类都知道它自己的消息是如何序列化的,并且可以依赖它(在C ++中)在流中下一条消息的开头返回指针。

我们可以使用一些内置机制来执行此操作(不使用unsafe)吗?操作频率高(~10kps),重量很轻。我们也不想复制或修剪数组。

感谢您的帮助。

5 个答案:

答案 0 :(得分:2)

你能不能直接传入并返回数组索引?这基本上都是一个指针,一个固定内存位置的偏移量。

答案 1 :(得分:2)

这听起来好像你想要一个简单的流(例如,只需使用MemoryStream作为字节数组的包装器:stream = new MemoryStream (data)).只需将字节数组包装成一个流,每个对象都可以从流中读取所需数量然后将流移交给下一个项目。它甚至可以让您不必立即加载整个字节数组。

除此之外,您可以完全按照C ++中的方式使用C#中的指针(尽管指针需要unsafe关键字并且不鼓励它们)

或者你可以传递数据和索引变量,然后递增索引(实际上,与使用指针相同,但不需要不安全)。

答案 2 :(得分:0)

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

答案 3 :(得分:0)

我想有几件事情会浮现在脑海中。

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

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

然后当然有一个可怕的不安全选项,你可以获得一个指向byte []的C#指针并执行所需的指针算法。

答案 4 :(得分:0)

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

Stream stream = new MemoryStream(data);

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