【问题标题】:Convert byte array to structure in the Compact Framework将字节数组转换为 Compact Framework 中的结构
【发布时间】:2012-11-16 14:41:21
【问题描述】:

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

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 Framework 中是否有其他方法可以完成这项工作?

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

}

【问题讨论】:

    标签: c# struct windows-mobile compact-framework bytearray


    【解决方案1】:

    Marshal.PtrToStructure 有效,我已经在紧凑的框架中多次使用它。看起来您使用正确。因此,问题一定是您的结构定义(结构的 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);
        }
    

    我会检查以确保您遵循这些准则Marshaling Structures in the .NET Compact Framework

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

    【讨论】:

    • @Nick Hmm.. 你也有标题的 C 定义吗?
    • @Nick 是的,我认为这可能会有所帮助。您发布的所有内容看起来都很好。你的代码和我知道的代码的唯一区别是你的 Marshal.SizeOf(str) 我会使用 Marshal.SizeOF(typeof(SFHeader)) 但我认为这不重要。另外,我对 MarshalAs 相对于您的非托管类型的使用感到好奇。所以我希望将您的非托管类型与托管结构进行比较
    • @Nick 我知道你没有在那里做任何互操作......所以不确定它会有所帮助。我将在我的设备上运行此代码,看看会发生什么
    • @Nick 查看我的更新,我运行了代码,它似乎可以工作。也许是缓冲区的内容导致了问题
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-09-14
    • 1970-01-01
    • 1970-01-01
    • 2011-02-11
    • 1970-01-01
    相关资源
    最近更新 更多