题
我们有,我们需要从一个流的一些数据反序列为多个对象的应用程序。
数据阵列表示数包装在一起可变长度的消息。有没有消息流中划定的代码。
我们想要做的事,如:
void Decode(byte[] Data)
{
Object0.ExtractMessage(Data);
Object1.ExtractMessage(Data);
Object2.ExtractMessage(Data);
...
}
,其中每个过程数据呼叫知道哪里可以在阵列中启动。理想的情况下,我们会做到这一点没有在传递DataIx
参考。
要做到这一点在C ++中,我们会只是手围绕一个指针到阵列,并且如所需要的每个过程数据功能将加一。
每个对象类都知道它自己的消息的序列化,并且可以在(在C ++)被依赖于在数据流中的下一个消息的开始时返回指针。
有没有我们可以用它来做到这一点(没有去unsafe
)一些内在机制?操作是高频(〜10kps)和非常轻巧。我们也不想去复制或修剪的阵列。
感谢您的帮助。
解决方案
你能不只是传递和返回数组的索引?即基本上所有的指针是,无论如何,从一个固定的存储器位置的偏移量。
其他提示
嗯,这听起来像你想要一个简单的流(例如只使用的MemoryStream,成为您身边的字节数组的包装:stream = new MemoryStream (data)).
只是包装的字节数组流和它在需要再动手每个对象从流中读取尽可能多流的下一个项目。它甚至有您没有被迫在一次加载整个字节数组的益处。
以外,你可以使用C#正是你在C ++做的方式指针(尽管指针要求不安全的关键字和他们气馁)
或者,也可以只通过数据和索引变量,然后递增索引(其实际上是,同样作为使用指针,但并不需要不安全)。
如何在一个MemoryStream包裹所述数据,然后使一个StreamReader到ExtractMessage方法?
我想几件事情浮现在脑海中。
您可以通过在一类也保持阵列偏移包裹字节[]模拟指针的动作。每当你访问数组,你会访问通类,可能是通过一个存取方法,它返回的下一个字节,也增加了offset变量。类的实例可以在不同ExtractMessage函数调用之间传递。
如何使用C ++ / CLI?这将允许您使用熟悉的C / C ++技术,并且还从C#直接调用而不可怕的互操作。
然后,当然有可怕的不安全的选项,由此获得一个C#指针字节[]和执行所需的指针运算。
您可以创建从字节数组一个stream
。
Stream stream = new MemoryStream(data);
然后,你的处理器可以在工作流代替。