C# 在紧凑型框架中将字节数组转换为结构

C# 在紧凑型框架中将字节数组转换为结构,c#,struct,windows-mobile,compact-framework,bytearray,C#,Struct,Windows Mobile,Compact Framework,Bytearray,我需要将字节数组转换为我的结构类型。为此,我对桌面项目应用程序使用以下代码: var str = new SFHeader(); int size = Marshal.SizeOf(str); IntPtr ptr = Marshal.AllocHGlobal(size); Marshal.Copy(buffer, 0, ptr, size); str = (SFHeader)Marshal.PtrToStructure(ptr, typeof(SFHeader)); Marshal.Free

我需要将字节数组转换为我的结构类型。为此,我对桌面项目应用程序使用以下代码:

var str = new SFHeader();
int size = Marshal.SizeOf(str);

IntPtr ptr = Marshal.AllocHGlobal(size);
Marshal.Copy(buffer, 0, ptr, size);
str = (SFHeader)Marshal.PtrToStructure(ptr, typeof(SFHeader));
Marshal.FreeHGlobal(ptr);

return str;
其中
SFHeader
是我的结构。

问题是线路:

str = (SFHeader)Marshal.PtrToStructure(ptr, typeof(SFHeader));
从智能设备项目运行此代码时引发
NotSupportedException
。在Compact框架中是否有其他方法来完成这项工作

[StructLayout(LayoutKind.Sequential)]
public struct SFHeader
{

    internal const int MAX_FILENAME_LENGTH = 32;


    [MarshalAs(UnmanagedType.ByValTStr, SizeConst = MAX_FILENAME_LENGTH)]
    public string FileName;

    public int Offset;

    public short Size;

    public byte Flags;

    public byte Source;

    public long LastWriteTime;

}

PtrToStructure可以工作,我在compact框架中使用过很多次。看起来您正在正确使用它。因此,问题一定是您的结构定义(结构的CF中可能不支持某些内容)

以下代码在使用Windows CE 5.0和.NET CF 3.5的设备上运行良好

[StructLayout(LayoutKind.Sequential)]
    public struct SFHeader
    {
        internal const int MAX_FILENAME_LENGTH = 32;
        [MarshalAs(UnmanagedType.ByValTStr, SizeConst = MAX_FILENAME_LENGTH)]
        public string FileName;
        public int Offset;
        public short Size;
        public byte Flags;
        public byte Source;
        public long LastWriteTime;
    }

    private static void Test()
    {
        var str = new SFHeader();
        int size = Marshal.SizeOf(str);
        byte[] buffer = new byte[size];

        IntPtr ptr = Marshal.AllocHGlobal(size);
        Marshal.Copy(buffer, 0, ptr, size);
        str = (SFHeader)Marshal.PtrToStructure(ptr, typeof(SFHeader));
        Marshal.FreeHGlobal(ptr);
    }
我会检查以确保您遵守这些指导原则


另一个选项是将字段从缓冲区逐字节手动复制到结构中。您可以编写一个返回SFHeader并获取字节[]的函数。

@Nick Hmm。。你也有标题的C定义吗?@Nick是的,我想这可能会有帮助。你发布的所有内容看起来都不错。你的代码和我所知道的代码唯一的区别是你的Marshal.SizeOf(str),我会使用Marshal.SizeOf(typeof(SFHeader)),但我认为这不重要。此外,我还对MarshalAs相对于非托管类型的用法感到好奇。所以我希望将非托管类型与托管类型进行比较struct@Nick我知道你没有在那里进行任何互操作。。所以我不确定这是否有帮助。我要在我的设备上运行这段代码看看是什么happens@Nick看到我的更新,我运行了代码,它似乎工作。可能是缓冲区的内容导致了问题