来自特定索引的字节数组作为C#中的struct,而没有进行复制

宇宙

目前,我编写客户端服务器垃圾代码,并处理通过网络传递的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] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

在发布请求之前将字节数组转换为C#字节数组

没有获取字节数组流的方法

将字节数组复制到C#中的另一个字节数组

字节数组中的字节数

从C ++到C#的pinvoke字节数组

从C ++ DLL返回字节数组到C#

调试C#存储字节数组-内存中或仅以内联代码形式的byte [32]特定字节,如何进行测试

如何将字节数组转换为没有标题C#的声音?

使用BigInteger进行C#字节数组计算无法正常工作

有没有一种方法可以将字节数组转换为C ++中的数字?

python 3中字节数组索引的行为

在Powershell中,如何使用字节数组作为C#通用类之一的键类型?

如何复制字节数组

从字节数组C#中读取特定的字节

汇编-复制字节数组-MIPS

AS3字节数组到C#字节数组

将字节从字节数组复制到C#中另一个字节数组的特定位置

C#如何从字节数组中提取字节?具有已知的起始字节

如何在C#中将字节数组或字符串作为文件http发布

获取没有标题C#的位图字节数组

c# - 如何按特定数组值拆分字节数组?

来自 json 的响应字节数组

将字符串格式的python字节转换为c#中的字节数组

字节数组属性 C#

使用 C# 在字节数组中设置位

如何在 C# 或字节数组左移操作中执行位复制

在 C# 中获取 ZipArchive 的字节数组

有没有一种简单的方法可以在 C# 中将 ListArray 转换为字节数组?

如何从C中的字节数组中删除字节?