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看到我的更新,我运行了代码,它似乎工作。可能是缓冲区的内容导致了问题