Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/285.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 从非托管内存中的字节读取字符数组_C#_Pinvoke_Marshalling - Fatal编程技术网

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];

我正在将本机win 32代码封送到c#,因为在联合体内部的结构中混合了
值类型
成员和
引用类型
成员,我将所有引用类型转换为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,我根本不想使用引用类型。