目前,我编写客户端服务器垃圾代码,并处理通过网络传递的C ++结构。我知道这里提供的方法是从字节数组中读取C#中的C / C ++数据结构,但它们都涉及复制。
我想要这样的东西:
struct/*or class*/ SomeStruct
{
public uint F1;
public uint F2;
public uint F3;
}
稍后在我的代码中,我想要这样的东西:
byte[] Data; //16 bytes that I got from network
SomeStruct PartOfDataAsSomeStruct { get { return /*make SomeStruct instance based on this.Data starting from index 4, without copying it. So when I do PartOfDataAsSomeStruct.F1 = 132465; it also changes bytes 4, 5, 6 and 7 in this.Data.*/; } }
如果可能的话,请告诉如何?
这样吗
byte[] data = new byte[16];
// 00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00
Console.WriteLine(BitConverter.ToString(data));
ref SomeStruct typed = ref Unsafe.As<byte, SomeStruct>(ref data[4]);
typed.F1 = 42;
typed.F2 = 3;
typed.F3 = 9;
// 00-00-00-00-2A-00-00-00-03-00-00-00-09-00-00-00
Console.WriteLine(BitConverter.ToString(data));
这使用作为数据的“内部托管指针”的ref-local从字节数组的中间强制数据。零份。
如果您需要多个项目(例如向量的工作方式),则可以使用span和 MemoryMarshal.Cast
请注意,它对元素使用CPU-endian规则-在我的情况下为little endian。
对于跨度:
byte[] data = new byte[256];
// create a span of some of it
var span = new Span<byte>(data, 4, 128);
// now coerce the span
var typed = MemoryMarshal.Cast<byte, SomeStruct>(span);
Console.WriteLine(typed.Length); // 10 of them fit
typed[3].F1 = 3; // etc
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句