c# - 在 Compact Framework 中将字节数组转换为结构

标签 c# struct windows-mobile compact-framework arrays

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

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;

}

最佳答案

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[] 的函数。

关于c# - 在 Compact Framework 中将字节数组转换为结构,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13418795/

相关文章:

c# - 使用 EF 立即执行

c - 为什么我总是丢失结构成员的值?

pointers - Go 似乎没有像我想的那样传递指针

windows-mobile - Windows 移动设备或 CE 设备上的 GDI 性能

c# - 如何监控麦克风的噪音?

javascript - 如何解决此 WCF/AJAX 问题? (访问数据库时出现 400 Bad Request 错误)

c# - 动画基础数学

c# - 保存上传到 azure 网站的文件

c++ - 在结构中指定设备特定功能

.net - 对于 .net 开发人员来说,进入移动开发的学习曲线是怎样的?