C# 从非托管内存中的字节读取字符数组
我正在将本机win 32代码封送到c#,因为在联合体内部的结构中混合了C# 从非托管内存中的字节读取字符数组,c#,pinvoke,marshalling,C#,Pinvoke,Marshalling,我正在将本机win 32代码封送到c#,因为在联合体内部的结构中混合了值类型成员和引用类型成员,我将所有引用类型转换为byte,并使用fielOffset处理它们的大小。现在我想访问其中一个成员的值,但我不知道如何操作。以下代码是示例 这里是C++结构< /p> typedef struct { int Port; char SubsId[FIELD_SIZE_SUBS_ID+1]; char Options[FIELD_SIZE_OPTIONS+1];
值类型
成员和引用类型
成员,我将所有引用类型转换为byte,并使用fielOffset
处理它们的大小。现在我想访问其中一个成员的值,但我不知道如何操作。以下代码是示例
这里是C++结构< /p>
typedef struct
{
int Port;
char SubsId[FIELD_SIZE_SUBS_ID+1];
char Options[FIELD_SIZE_OPTIONS+1];
} MMTPRcnxReq;
这是c#等价物
[StructLayout(LayoutKind.Explicit, CharSet = CharSet.Ansi)]
public struct MMTPRcnxReq
{
[FieldOffset(0)]
public Int32 Port;
[FieldOffset(4)]
public byte SubsId;
[FieldOffset(4 + FIELD_SIZE_SUBS_ID + 1)]
public byte Options;
}
现在我想访问SubId的值,它实际上是一个字符数组,对于exmaple,将其与托管代码中的字符串进行比较,
如下
if(mMTPRcnxReq.SubsId == "12345") // WRONG
我怎样才能做到这一点呢?在这里,您可能需要对固定大小的缓冲区使用
不安全的
unsafe struct MMTPRcnxReq
{
public int Port;
public fixed byte SubsId[FIELD_SIZE_SUBS_ID+1];
public fixed byte Options[FIELD_SIZE_OPTIONS+1];
}
固定大小的缓冲区是一种值类型,允许您将其中一个结构放入FieldOffset(0)
C#联合中
阅读如下字符串:
string SubsId;
unsafe
{
fixed (byte* ptr = req.SubsId)
{
// I presume that req.SubsId is null-terminated
SubsId = Marshal.PtrToStringAnsi((IntPtr)ptr);
}
}
您可能会编写结构的helper getter和setter方法(可能作为属性)来管理固定大小的缓冲区。我被您的问题弄糊涂了,首先一个char
有多个byte
,一个字符串至少有一个char
subfid
不能是字符数组,如果它声明为byte
@AlexFarber,我根本不想使用引用类型。