gpt4 book ai didi

c# - 如何在 C# 中将数组放入结构中?

转载 作者:太空狗 更新时间:2023-10-29 23:38:30 24 4
gpt4 key购买 nike

C++代码:

struct tPacket
{
WORD word1;
WORD word2;
BYTE byte1;
BYTE byte2;
BYTE array123[8];
}

static char data[8192] = {0};
...
some code to fill up the array
...
tPacket * packet = (tPacket *)data;

我们不能在 C# 中轻松做到这一点。

请注意 C++ 结构中有一个数组。

或者,使用 this source file可以为我们完成这项工作,但如果结构中有数组则不行。

最佳答案

我不确定你到底在问什么。您是否试图在 C# 中获得等效的结构定义以用于普通的旧 C# 用法或用于互操作 (PInvoke) 目的?如果它用于 PInvoke,则 follownig 结构将起作用

[System.Runtime.InteropServices.StructLayoutAttribute(System.Runtime.InteropServices.LayoutKind.Sequential)]
public struct tPacket {

/// WORD->unsigned short
public ushort word1;

/// WORD->unsigned short
public ushort word2;

/// BYTE->unsigned char
public byte byte1;

/// BYTE->unsigned char
public byte byte2;

/// BYTE[8]
[System.Runtime.InteropServices.MarshalAsAttribute(System.Runtime.InteropServices.UnmanagedType.ByValArray, SizeConst=8, ArraySubType=System.Runtime.InteropServices.UnmanagedType.I1)]
public byte[] array123;
}

如果您正在寻找具有相同特征的普通旧 C# 结构,不幸的是,使用结构是不可能的。您不能在 C# 结构中定义一个常量大小的内联数组,也不能通过初始化程序强制该数组为特定大小。

在托管世界中有两个替代选项。

使用具有填充数组的创建方法的结构

[System.Runtime.InteropServices.StructLayoutAttribute(System.Runtime.InteropServices.LayoutKind.Sequential)]
public struct tPacket {
public ushort word1;
public ushort word2;
public byte byte1;
public byte byte2;
public byte[] array123;
public static tPacket Create() {
return new tPacket() { array123 = new byte[8] };
}
}

或者使用可以直接初始化 array123 成员变量的类。

编辑 OP watns 知道如何将 byte[] 转换为 tPacket 值

不幸的是,在 C# 中没有很好的方法可以做到这一点。 C++ 非常适合这类任务,因为它有一个非常弱的类型系统,您可以选择将字节流视为特定结构(邪恶指针转换)。

这在 C# 不安全代码中可能是可能的,但我不相信这是可能的。

基本上,您需要做的是手动解析字节并将它们分配给结构中的各种值。或者编写一个执行 C 样式转换和 PInvoke 到该函数中的 native 方法。

关于c# - 如何在 C# 中将数组放入结构中?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/690382/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com