我们有一个应用程序,我们需要将一些数据中的某些数据反序列化为多个对象。
Data数组表示许多可变长度的消息打包在一起。流中没有消息分隔代码。
我们想做类似的事情:
void Decode(byte[] Data)
{
Object0.ExtractMessage(Data);
Object1.ExtractMessage(Data);
Object2.ExtractMessage(Data);
...
}
其中每个ProcessData调用都知道在数组中从哪里开始。理想情况下,我们会在不传递DataIx
引用的情况下执行此操作。
要在C ++中执行此操作,我们只需将指针移到数组中,每个ProcessData函数都会根据需要递增它。
每个对象类都知道它自己的消息是如何序列化的,并且可以依赖它(在C ++中)在流中下一条消息的开头返回指针。
我们可以使用一些内置机制来执行此操作(不使用unsafe
)吗?操作频率高(~10kps),重量很轻。我们也不想复制或修剪数组。
感谢您的帮助。
答案 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);
然后你的处理器可以在流上工作。