gpt4 book ai didi

c# - 从 C++ 到 C# .Net Compact Framework 的结构转换问题

转载 作者:塔克拉玛干 更新时间:2023-11-03 06:45:18 24 4
gpt4 key购买 nike

我正在将 c/c++ 结构转换为 C# 标准。

C/C++ 结构:

 typedef struct _sta_conn_info{
STA_CONNECT_STATE connect_state;//Enum
STA_ASSOC_STATE assoc_state;//Enum
unsigned char bssid[6];
unsigned char ssid[34];
unsigned long channel;
enum mode mode;//Enum
unsigned long signalStrength;
unsigned long noiseLevel;
STA_AUTH_ALG auth_alg;//enum
STA_ENCRYPT_ALG encrypt_alg;//enum
}STA_CONN_INFO;


typedef struct _NDISUIO_QUERY_OID
{
NDIS_OID Oid;
PTCHAR ptcDeviceName;
UCHAR Data[sizeof(ULONG)];
} NDISUIO_QUERY_OID, *PNDISUIO_QUERY_OID;

各自的C#结构:

     [StructLayout(LayoutKind.Sequential, CharSet = CharSet.Unicode)]
public struct _sta_conn_info
{
public _sta_connect_state connect_state;
public _sta_assoc_state assoc_state;

[MarshalAs(UnmanagedType.ByValArray,SizeConst = 6)]
public char[] bssid ;//= new char[6];

[MarshalAs(UnmanagedType.ByValArray,SizeConst = 34)]
public char[] ssid ;//= new char[34]

public uint channel;
public mode mode;
public uint signalStrength;
public uint noiseLevel;
public _sta_auth_alg auth_alg;
public _sta_encrypt_alg encrypt_alg;
}

QUERY STRUCT:
[StructLayout(LayoutKind.Sequential, CharSet = CharSet.Unicode)]

public struct _NDISUIO_QUERY_OID
{
public uint Oid;
[MarshalAs(UnmanagedType.LPWStr)]
public string ptcDeviceName;
public byte[] Data;
};

我使用这个转换了数据类型 >>> reference

Marshal.SizeOf() 在 WIN CE 中工作。我测试了它。

如果我的结构转换没问题,那么 Marshal.SizeOf() 肯定会获取结构的大小,但它会抛出异常并返回 错误代码 87在 DeviceIoControl() API 中。

任何人都可以向我解释一下转换,如果我做错了什么,请告诉我。

最佳答案

bssidssid 的 C++ 声明是:

unsigned char bssid[6];
unsigned char ssid[34];

现在,unsigned char 是单个字节,通常用于字节数组而不是文本。所以 C# 应该是:

[MarshalAs(UnmanagedType.ByValArray,SizeConst = 6)]
public byte[] bssid ;//= new byte[6];

[MarshalAs(UnmanagedType.ByValArray,SizeConst = 34)]
public byte[] ssid ;//= new byte[34]

您在 C# 中使用 char 是不正确的,因为 char 在 C# 中是两个字节宽。

_NDISUIO_QUERY_OID 中你有

[MarshalAs(UnmanagedType.ByValTStr, SizeConst = sizeof(uint))]
public byte[] Data;

我认为您需要使用 ByValArray 而不是 ByValTStr。但正如我们在您最近的许多问题中所讨论的那样,该成员的确切含义尚不清楚。它真的是一个固定长度的字节数组,还是一个可变长度的缓冲区?您有可用的示例 C++ 代码吗?这将一劳永逸地解决争论。


好的,从 header nuiouser.h header 文件我有这个:

//
// Structure to go with IOCTL_NDISUIO_QUERY_OID_VALUE.
// The Data part is of variable length, determined by
// the input buffer length passed to DeviceIoControl.
//
typedef struct _NDISUIO_QUERY_OID
{
NDIS_OID Oid;

#ifdef UNDER_CE
//
// In CE land app is allowed to query without having to do
// IOCTL_NDISUIO_OPEN_DEVICE
// Hence the device name to query argument needed..
// For app that does IOCTL_NDISUIO_OPEN_DEVICE this argument
// is then not necessary..
//

PTCHAR ptcDeviceName;
#endif

UCHAR Data[sizeof(ULONG)];

} NDISUIO_QUERY_OID, *PNDISUIO_QUERY_OID;

这最终告诉您 Data 是可变长度的。恐怕您需要使用 AllocHGlobal 分配结构并手动进行所有编码。

关于c# - 从 C++ 到 C# .Net Compact Framework 的结构转换问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22660585/

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